2016-12-08 2 views
0

У меня есть следующий бит Powershell в скрипте, который должен будет запускать множество машин и добавлять раздел реестра. На машине x64 этот ключ требует добавления в 32-разрядную и 64-разрядную секцию реестра.Обработка исключений с использованием SWbemLocator на разных архитектурах

$objswbem = New-Object -ComObject "WbemScripting.SWbemNamedValueSet"    
    $objswbem.Add("__ProviderArchitecture", $Arch) | Out-null    
    $objswbem.Add("__RequiredArchitecture", $True) | Out-null    
    $ObjLocator = New-Object -ComObject "Wbemscripting.SWbemLocator"    
    $objServices = $objLocator.ConnectServer($Computer,"root\Default",$null,$null,$null,$null,$null,$objswbem)    
    $objReg = $objServices.Get("stdRegProv") 

Это будет иметь как значения 32, так и 64, переданные ему отдельно.

То, что я не уверен в том, какое исключение будет выбрано на 32-битной машине, если для $Arch установлено значение 64, поскольку мне нужно обработать это и позволить сценарию продолжить работу без выполнения 64-битных операций, иначе выкиньте исключение. Я протестировал с недопустимым номером, например 128, и он выбрал неверное числовое исключение в $objLocator.ConnectServer. Я просто не уверен, что это будет то же самое исключение с действительным номером 64.

У меня нет доступа к 32-битной машине, чтобы проверить сценарий самостоятельно и не нашли соответствующую документацию в Интернете.

ответ

1

Я даю вам логику, как продолжить его. Я сделал сценарий в соответствии с вашим требованием, и я также добавил комментарии к каждой строке для вашего понимания и ссылки. Добавьте коды, что когда вы делаете на основе этого

$Input_file= Get-Content D:\Serverlist.txt # Getting list of servers from the text file 

foreach($Input in $Input_file) # Iterating each server 
{ 
    $OS_Architecture=(Get-WmiObject Win32_OperatingSystem -ComputerName $Input).OSArchitecture # Getting the OS Architecture for each server 
    if($OS_Architecture -eq '64-bit') 
    { 
    # write the code for 64 bit OS Architecture 
    <# 
    $objswbem = New-Object -ComObject "WbemScripting.SWbemNamedValueSet"    
    $objswbem.Add("__ProviderArchitecture", $Arch) | Out-null    
    $objswbem.Add("__RequiredArchitecture", $True) | Out-null    
    $ObjLocator = New-Object -ComObject "Wbemscripting.SWbemLocator"    
    $objServices = $objLocator.ConnectServer($Computer,"root\Default",$null,$null,$null,$null,$null,$objswbem)    
    $objReg = $objServices.Get("stdRegProv") 
    #> 
    } 
    else 
    { 
    # Write the code for 32 Bit OS Architecture 
    } 

Примечания: Если вы работаете все команды удаленно затем использовать ScriptBlock и Invoke-команду проходящей в computernames в качестве параметра.

Надеюсь, это поможет вам понять логику.

+0

Спасибо - поставил меня на правильном пути. –

+0

рады помочь. Goodluck @MatthewNorth –

Смежные вопросы