Powershell Query Multiple Computers для публичного IP-адреса не работает - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь запросить у нескольких компьютеров их общедоступный IP-адрес.Если я использую сценарий 1, я могу одновременно запрашивать только один компьютер и сохранять результаты в файл.Если я использую текстовый файл с несколькими компьютерными именами, запрашиваются только 1 или 2 компьютера.(Я могу запросить все компьютеры, если я делаю 1 на 1.)

Затем я добавил try, перехватить в сценарии 2, чтобы перехватить все не отвечающие компьютеры, но этот сценарий ничего не выводит.В идеале я хотел бы запросить несколько компьютеров и перехватить все не отвечающие компьютеры, но скрипт 2 не будет работать.

Скрипт 1

$computers= Get-Content .\hostnames.txt

foreach ($computer in $computers) {

$computerSystem = (get-wmiobject Win32_ComputerSystem -Computer $computer).name 

$IP=Invoke-Command -ComputerName $computer -ScriptBlock {
(Invoke-WebRequest -uri "http://smart-ip.net/myip" -UseBasicParsing).content }  -ErrorAction SilentlyContinue } 

$computerSystem, $ip | out-file .\output2.csv -Append

Скрипт 2

$computernames =  Get-Content .\hostnames.txt
$NotRespondingLog = ".\notresponding.log" 

$data = ForEach ($Computer in $computernames) {
try{

$computerSystem = (get-wmiobject Win32_ComputerSystem -Computer $computer).name 

$IP=Invoke-Command -ComputerName $computer -ScriptBlock {

(Invoke-WebRequest -uri "http://smart-ip.net/myip" -UseBasicParsing ).content }  -ErrorAction SilentlyContinue 

} catch{
    $Computer | Out-File -FilePath $NotRespondingLog -Append -Encoding UTF8
        continue    } }

$data | out-file ".\output2.csv" -Append 

1 Ответ

1 голос
/ 26 июня 2019

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

Если вы удивляетесь, почему ваш try/catch не оценивается, это потому, что по вашей Invoke-WebRequest команде у вас есть -ErrorActionPreference установлен как SilentlyContinue.Это прямо говорит PowerShell, что мы не хотим оценивать блок перехвата или оповещать при возникновении ошибки.

Здесь я немного переписал ваш код для ясности и добавил шаг или два для вывода объектов обратно, что и делают строки с одиночными командами $thisPC .Будь то внутри блока try или блока catch, мы просто создаем новые объекты PowerShell, сопоставляем свойства, затем отправляем их в консоль и добавляем в список дорожек $ComputerList.Это очень распространенный шаблон, который вы увидите в сценариях, готовых к использованию на предприятии.

$computernames =  'SomePC123','SomePC234','OfflinePC'

$ComputerList = New-Object System.Collections.ArrayList

ForEach ($Computer in $computernames) {
    try{
        $computerName = (get-wmiobject Win32_ComputerSystem -Computer $computer).name 
        $IP= Invoke-Command -ComputerName $computer -ScriptBlock {
            (Invoke-WebRequest -uri "http://smart-ip.net/myip" -UseBasicParsing ).content -ErrorAction Stop
        }
        $thisPC = [psCustomObject]@{Name=$computerName;IP=$IP}
        $thisPC 
        $ComputerList.Add($thisPC) | Out-Null
    } 
    catch{
        $thisPC = [psCustomObject]@{Name=$Computer;IP='Not Responding'}
        $thisPC
        $ComputerList.Add($thisPC) | Out-Null
    } 
}

$ComputerList | out-file ".\output2.csv" -Append 

Вот его вывод:

Name      IP             
----      --             
SomePC234 149.178.121.237
OfflinePC Not Responding 
SomePC123 48.40.234.122 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...