无法将 return false 的 ping 计算机名称通过管道传输到 test-netconnection

Unable to pipe names of pinged computers that return false to test-netconnection

我正在尝试创建一个基本脚本,从文本文件中提取计算机名称列表,然后对它们执行 ping 操作,然后 return 判断真假。然后我想将 returned false 的那些输出到文本文件,这样我就可以知道哪些没有响应。

最接近我想要的如下:

$workstations = Get-Content "workstation_list.txt"
$workstations | Test-NetConnection -InformationLevel Quiet -WarningAction SilentlyContinue

然而,每当我尝试将结果通过管道传输到任何地方时,我得到的只是真或假。

如何传递 $workstations 数组中的原始名称以显示所有 return 错误的名称?

我试过:

$workstations = Get-Content "workstation_list.txt"
$workstations | 
    Test-NetConnection -InformationLevel Detailed -WarningAction SilentlyContinue | 
        Select-Object computername, pingsucceeded | 
            if(pingsucceeded -eq False){write-output} else{continue}

出现以下错误:

pingsucceeded : The term 'pingsucceeded' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, 
verify that the path is correct and try again.
At line:11 char:144
+ ...  Select-Object computername, pingsucceeded | if(pingsucceeded -eq Fal ...
+                                                     ~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (pingsucceeded:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException*

但是我无法弄清楚如何只 return 计算机的原始名称 return 在我 ping 时它是假的。

然后我想将它输出到文本文件,但是如果我无法将正确的信息传递到屏幕,它也不会转到文件。

我是关闭还是需要以完全不同的方式处理这个问题?

谢谢!

PS.this 是我第一次发布有关堆栈溢出的问题,如果我需要以不同的方式提供信息以使您更容易回答,请提供建设性的反馈,以便我做得更好将来。

我建议使用 PSCustomObject 来存储您的结果,如下所示:

$workstations = Get-Content "workstation_list.txt"
$Result =
foreach ($ComputerName in $workstations) {
    [PSCustomObject]@{
        ComputerName = $ComputerName
        Online = (Test-Connection -ComputerName $ComputerName -Count 1 -Quiet)
    }
}
$Result

这样您可以根据需要使用变量 $Result 进行进一步的操作。例如输出成功的

$Result | Where-Object -Property 'Online' -EQ -Value $true

或者过滤不成功的输出到另一个文件例如:

$Result | 
    Where-Object -Property 'Online' -EQ -Value $false |
        Select-Object -ExpandProperty ComputerName |
            Out-File -FilePath 'offline_workstation_list.txt'

您需要学习一些基本的 powershell。你不能通过管道传递给 if 语句,但你可以传递给 foreach-object:

$workstations = Get-Content "workstation_list.txt"
$workstations |
Test-NetConnection -InformationLevel Detailed -WarningAction SilentlyContinue |
Select-Object computername, pingsucceeded |
foreach-object { if($_.pingsucceeded -eq $False){write-output $_} else{continue} }

ComputerName  PingSucceeded
------------  -------------
microsoft.com         False

尝试使用调用运算符和 $input。

echo hi | & { if ($input -eq 'hi') { 'yes' } }

yes