首页 > 解决方案 > 要求进行代码审查:PowerShell 对本地 PC 而不是 $inventory 中所需的远程 PC 执行多次

问题描述

Stack Overflow 社区——您好!长期聆听者,第一次来电者。另外,这是我第一次涉足脚本领域,所以不要把我打得太惨!

我拼凑了一个测试脚本(来自多个网站),我试图用它来识别一些 USB 设备。它目前正在我本地网络上的 4 台机器上进行测试,但最终会达到数千台。

长话短说,我的 PS 脚本在运行时似乎没有使用我的$inventory变量,而是在我的本地 PC 上运行脚本的次数与我在变量中有条目的次数相同,并且输出相同(四个在这种情况下时间)。当然,我忽略了一些简单的事情,但是阅读相同的文章数小时并没有让我到任何地方。我愿意接受任何建议!

$inventory = "pc1","pc2","pc3","pc4"
$target = "*usb*"

ForEach ($i in $inventory) {
Get-WmiObject win32_usbcontrollerdevice |%{[wmi]($_.Dependent)} | Where-Object {($_.Service -like $target)} | Sort SystemName,Manufacturer,Description,DeviceID | ft SystemName,Manufacturer,Description,DeviceID -auto 
}

输出(请注意,下面列出的MyLocalPC应该是上面列出的四台远程 PC):

SystemName 制造商 描述
DeviceID
---------- ------------ ----------- --------
MyLocalPC (Generic USB Audio ) USB 音频设备 USB\VID_046D&PID_0A44&MI_00\7&73B6162&0&0000 (...为简洁起见缩短输出...)

SystemName 制造商 描述
DeviceID
---------- ------------ ----------- --------
MyLocalPC (Generic USB Audio ) USB 音频设备 USB\VID_046D&PID_0A44&MI_00\7&73B6162&0&0000 (...为简洁起见缩短输出...)

SystemName 制造商 描述
DeviceID
---------- ------------ ----------- --------
MyLocalPC (Generic USB Audio ) USB 音频设备 USB\VID_046D&PID_0A44&MI_00\7&73B6162&0&0000 (...为简洁起见缩短输出...)

SystemName 制造商 描述
DeviceID
---------- ------------ ----------- --------
MyLocalPC (Generic USB Audio ) USB 音频设备 USB\VID_046D&PID_0A44&MI_00\7&73B6162&0&0000 (...为简洁起见缩短输出...)

另一条可能很重要的信息(?)——如果我写出 $i 的输出,它似乎是正确的:

PS C:\Users\me\Desktop> $inventory = "pc1","pc2","pc3","pc4"
$target = "*usb*"

ForEach ($i in $inventory) {Write-Output $i}
pc1
pc2
pc3
pc4

标签: powershellloopsvariablesforeach

解决方案


那是因为您只是根据 $inventory 中的项目数运行相同的代码。您实际上并没有在任何地方输入计算机名称。

-ComputerName使用当前项目添加参数,它应该可以按预期工作:

ForEach ($computer in $inventory) {
  Get-WmiObject win32_usbcontrollerdevice -ComputerName $computer | # pipe to other stuff
}

推荐阅读