无法将 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
我正在尝试创建一个基本脚本,从文本文件中提取计算机名称列表,然后对它们执行 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