Я пытаюсь запустить командлеты Get-WmiObject/Get-CimInstance на всех подключенных к сети компьютерах моего домена. Я пытался сделать что-то вроде этого:
Get-ADComputer -Filter * | Foreeach-Object {
#Do Something
}
Проблема в том, что если компьютер не подключен к сети, я получаю сообщение об ошибке, и, насколько мне известно, я не могу запустить эту команду только для компьютеров, подключенных к сети.
Итак, я подумывал о том, чтобы перейти на следующий компьютер, когда произойдет ошибка, используя -ErrorAction SilentlyContinue, но в любом случае он просто выполнит остальную часть кода внутри цикла, и я хочу этого избежать.
Есть ли способ выйти из цикла в моей ситуации, когда это произойдет, или каким-либо другим способом я мог бы сделать то, что мне нужно?
Спасибо !
Делайте параллельно get-ciminstance -computername computer1,computer2,computer3...





Используйте Test-Connection, чтобы проверить, можете ли вы подключиться к удаленному компьютеру, затем return из блока ForEach-Object, если вы не можете:
Get-ADComputer -Filter "Enabled -eq '$true'" |ForEach-Object {
# pick host name
if (-not($cn = $_.DNSHostName)) {
$cn = $_.Name
}
# test connectivity - change to `-Protocol DCOM` for Get-WmiObject
if (-not(Test-Connection -ComputerName $_.DNSHostName -Protocol WSMan -Quiet)) {
return
}
Get-CimInstance ... -ComputerName $cn
}
В powershell 5.1 вы можете быстро получить список компьютеров, подключенных к сети, вот так (время ответа и адрес — это фактические свойства):
if (! (test-path list.txt)) { Get-ADComputer -Filter * | % name |
set-content list.txt }
$list = get-content list.txt
$uplist = test-connection -count 1 $list -AsJob | receive-job -wait -auto |
? responsetime | % address
$uplist | Foreeach-Object {
#Do Something with $_
}
# or in parallel:
# invoke-command $uplist { 'whatever' }
Спасибо, использовал его с оператором if и отлично работает! if (Test-Connection -ComputerName $_.Name -Count 1 -Quiet) { }
@Wayne Что ты думаешь об этом редактировании?
Значит, все в $uplist будет компьютерами, на которых работал пинг, поэтому мне не нужно заморачиваться с оператором if? Это отличная идея, мне нравится, спасибо
Используйте Where-Object, чтобы отфильтровать нулевые записи.