Я создал сценарий powershell для поиска вещей, соответствующих определенным настройкам BIOS, а затем изменил их.Lenovo WMI BIOS Изменения сохраняются только при втором запуске
Единственная проблема: если я запустил ее один раз и перезагрузился, она не сохранит настройки, хотя у меня есть успех. Если я запускаю его дважды, настройки сохраняются.
Я думаю, что это имеет какое-то отношение к моим переменным и операторам 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"
}
Благодарим вас за ответ Дэвид, но все же любопытно. Если я объявляю переменную $ savebios в попрошайничестве с помощью команд, которые она должна выполнить, почему бы мне не вызвать эту переменную в конце для выполнения этих команд? – user160396
После добавления этого как функции и вызова функций, которые он сохранил в первый раз. Еще раз спасибо. – user160396
@ user160396 Я не уверен, понимаю ли я. Вызывая '$ savebios', вы в основном отображаете или используете значение. Вы назначаете значение переменной, не выполняя команду. Когда вы объявляете переменную в начале, необходимо выполнить «команду», чтобы вы могли присвоить значение переменной. – David