我最初编写了一个脚本,它通过文本文件输入计算机名称,然后检查每个名称的一组路径中的子文件夹的名称。该脚本工作原理很好,但我想添加一个检查以仅检查联机的计算机。我尝试过的每个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名称。
答案 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
。