在powershell中使用Test-Connection一行脚本返回目录内容

时间:2015-12-08 15:40:49

标签: c# powershell

我最初编写了一个脚本,它通过文本文件输入计算机名称,然后检查每个名称的一组路径中的子文件夹的名称。该脚本工作原理很好,但我想添加一个检查以仅检查联机的计算机。我尝试过的每个Test-Connection方法最终都会将错误的值(或超出的值)传递到路径名中的$_变量中。

我试图将其保留为单行脚本的原因是为了避免必须更改PowerShell执行策略(这将在各种计算机上运行,​​而不是每次都运行相同的计算机。)

以下是我目前编写的代码。我已经考虑过简单地将它转换成C#,并且想知道是否有人可以通过这样做来考虑任何负面因素?

Get-Content c:\temp\serverlist.txt |
  Select-Object @{Name='ComputerName';Expression={$_}},
                @{Name='PROD XP Version';Expression={
                  Get-ChildItem -Path "\\$_\c$\Program Files (x86)\MyProgram",
                    "\\$_\c$\Program Files\MyProgam",
                    "\\$_\c$\Program Files (x86)\MyProgramTestFolder",
                    "\\$_\c$\Program Files\MyProgramTestFolder"
                }} > c:\temp\testVersions.txt

编辑:我最接近尝试的代码是:

Test-Connection -Count 1 -ComputerName (Get-Content C:\temp\serverlist.txt) |
  Select-Object @{Name='ComputerName';Expression={$_}},
                @{Name='PROD XP Version';Expression={
                  Get-ChildItem -Path "\\$_\c$\Program Files (x86)\MyProgram",
                    "\\$_\c$\Program Files\MyProgam",
                    "\\$_\c$\Program Files (x86)\MyProgramTestFolder",
                    "\\$_\c$\Program Files\MyProgramTestFolder"
                }} > c:\temp\testVersions.txt

这适用于正确列出NAME,但在检查路径时将一长串数据传递到$_。我尝试在路径中将$_更改为$_.address,但它没有任何影响。

不使用.address我的第一个计算机名称是\\BEN-ACH-LAP\root\cimv2:Win32_PingStatus.Address="BEN-ACH-LAP",BufferSize=...,这就是道路无法正常工作的原因,因为很明显,这不是有效的PC名称。

1 个答案:

答案 0 :(得分:1)

您希望过滤网络上可用的主机列表。为此,您需要在Test-Connection过滤器中运行Where-Object

Get-Content c:\temp\serverlist.txt |
  Where-Object { Test-Connection -Computer $_ -Count 1 -Quiet } |
  Select-Object ...

这只会将那些主机名/地址传递给响应ICMP请求的Select-Object