Lenovo WMI BIOS 更改仅保存在第二 运行 秒

Lenovo WMI BIOS Changes save on second run only

我制作了一个 powershell 脚本来查找与某些 bios 设置匹配的东西,然后更改它们。

唯一的问题是,如果我 运行 它一次并重新启动它不会保存设置,尽管我已经成功 returns。如果我运行它两次,设置被保存。

我认为这与我的变量和 foreach 语句有关。谁能告诉我我做错了什么?

#param ([string]$lenovopass)
$lenovopass= "password"

#Search BIOS for Virtual or Items starting with V.
$biosvalues= gwmi -class Lenovo_BiosSetting -namespace root\wmi | 
            Where-Object {$_.CurrentSetting.split(“,”,[StringSplitOptions]::RemoveEmptyEntries) -match “Virtual” -or $_.CurrentSetting.split(“,”,[StringSplitOptions]::RemoveEmptyEntries) -like "V*”} |
            Select-Object -ExpandProperty CurrentSetting
$biossplit= $biosvalues.split(",")[0,1]

#savebiossettings
$SaveBiosPass =(gwmi -class Lenovo_SaveBiosSettings -namespace root\wmi).SaveBiosSettings("$lenovopass,ascii,us") | Out-Null
$SaveBios =(gwmi -class Lenovo_SaveBiosSettings -namespace root\wmi).SaveBiosSettings() | Out-Null
$passcheck= (Get-WmiObject -namespace root\wmi -class Lenovo_BiosPasswordSettings | select -ExpandProperty PasswordState)

Function Lenovonopass{
foreach ($value in $biosvalues)
        {If ($value -match "Enable")
            {
            Write-Host "Found $value"
            Write-Host "Current Setting: $value"
            Write-Host "No changes made, $value already enabled."       
            } else { 
            Write-Host "Found $value"
            Write-Host "Current Settings: $value"
            $value = $value.split(",")[0,1]
            $valuea= $value[0]
            $valueb= $value[1]
            Write-Host "Changing $value state to Enable"
            (gwmi -class Lenovo_SetBiosSetting -namespace root\wmi).SetBiosSetting(“$valuea,Enable”) | Out-Null
            $SaveBios
            $newvalue = gwmi -class Lenovo_BiosSetting -namespace root\wmi | 
                        Where-Object {$_.CurrentSetting.split(“,”,[StringSplitOptions]::RemoveEmptyEntries) -match "$valuea"} | 
                        Select-Object -ExpandProperty CurrentSetting
            write-host "New Settings: $newvalue"                
                    }
                }
        }       
Function LenovoPass{
foreach ($value in $biosvalues)
        {If ($value -match "Enable")
            {
            Write-Host "Found $value"
            Write-Host "Current Setting: $value"
            Write-Host "No changes made, $value already enabled."       
            } else { 
            Write-Host "Found $value"
            Write-Host "Current Settings: $value"
            $value = $value.split(",")[0,1]
            $valuea= $value[0]
            $valueb= $value[1]
            Write-Host "Changing $value state to Enable"
            (gwmi -class Lenovo_SetBiosSetting -namespace root\wmi).SetBiosSetting(“$valuea,Enable,$lenovopass,ascii,us") | Out-Null
                $SaveBiosPass
                $newvalue = gwmi -class Lenovo_BiosSetting -namespace root\wmi | 
                        Where-Object {$_.CurrentSetting.split(“,”,[StringSplitOptions]::RemoveEmptyEntries) -match "$valuea"} | 
                        Select-Object -ExpandProperty CurrentSetting
            write-host "New Settings: $newvalue"
            Write-Host ""               
                    }
                }
        }       

IF ($passcheck -eq "0")
{Lenovonopass
$SaveBios
Write-Host "BIOS Changes Saved"
} Else {
Lenovopass
$SaveBiosPass
Write-Host "BIOS Changes Saved"
}

看起来您正在尝试通过调用一个变量来保存 bios 设置,就像它是一个函数一样。

$SaveBios
Write-Host "BIOS Changes Saved"

唯一一次保存设置是在脚本的开头,当您为 $SaveBios 赋值时。 因此,通过 运行 脚本两次,您将保存脚本开头的设置,您之前在 运行 中更改。

您可以改为为 SaveBios 创建一个函数。或在您实际要保存设置时将值分配给 $SaveBios

IF ($passcheck -eq "0")
{Lenovonopass
$SaveBios =(gwmi -class Lenovo_SaveBiosSettings -namespace root\wmi).SaveBiosSettings() | Out-Null
Write-Host "BIOS Changes Saved"
} Else {
Lenovopass
$SaveBiosPass =(gwmi -class Lenovo_SaveBiosSettings -namespace root\wmi).SaveBiosSettings("$lenovopass,ascii,us") | Out-Null
Write-Host "BIOS Changes Saved"
}