2016-04-17 3 views
0

Я создал сценарий 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" 
} 

ответ

0

Похоже, вы пытаетесь сохранить настройки 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" 
} 
+0

Благодарим вас за ответ Дэвид, но все же любопытно. Если я объявляю переменную $ savebios в попрошайничестве с помощью команд, которые она должна выполнить, почему бы мне не вызвать эту переменную в конце для выполнения этих команд? – user160396

+0

После добавления этого как функции и вызова функций, которые он сохранил в первый раз. Еще раз спасибо. – user160396

+0

@ user160396 Я не уверен, понимаю ли я. Вызывая '$ savebios', вы в основном отображаете или используете значение. Вы назначаете значение переменной, не выполняя команду. Когда вы объявляете переменную в начале, необходимо выполнить «команду», чтобы вы могли присвоить значение переменной. – David