我试图编写一个powershell脚本来报告域的给定范围内所有计算机使用的视频卡(GUM1到GUM150)。 我实际上成功地让机器通过远程PowerShell报告他们的视频卡,但有两个问题;
不按照在txt列表中定义的顺序查询(或报告?)机器。
主页名不会被报告回来,这意味着我有一个混乱的结果列表,没有相应的机器名。
这是我到目前为止所做的事情;
$comp = get-content c:\users\myusername\pcs.txt
其中pcs.txt是按主机名列出的机器列表,每个名称都在新行上。
然后;
get-wmiobject -class CIM_VideoController caption -namespace root/cimv2 -computername $comp | sort-object -property machinename | format-table machinename, caption > gpus.txt
我使用的参考书指出,使用get-wmiobject
会自动在返回的对象的结果中包含机器名(即主机名)。但我似乎无法将其显示在它返回的GPU名称(标题)旁边的列表中,它只返回一个包含GPU名称和机器名空白列的表。
我已经看过很多查询视频详细信息的例子,但是他们都会在每个机器的长列表中返回有关卡的大量详细信息,而我只想要主机名和显卡名称在表格中一起返回,以便轻松复制/粘贴到电子表格中。 我不确定CIM_VideoController是最好的WMI对象,但我见过的其他人都没有用结果对象返回GPU和主机名。
有什么想法吗?
答案 0 :(得分:2)
$comp
,但它包含comps数组,-computername参数不接受计算机名列表。您可以使用foreach循环来解决此问题。pcs.txt
中指定的顺序附加结果这一个班轮将负责所有这些:
get-content c:\users\myusername\pcs.txt | % { get-wmiobject -class CIM_VideoController -namespace root/cimv2 -computername $_ | format-table SystemName, caption >> gpus.txt}
这从文本文件中获取pcs数组,将每个pcs管理到wmi查询中(%
是foreach循环,$_
是管道中的对象,在这种情况下每行(pcs.txt),然后将每个单独查询的结果附加到gpus.txt,>
每次都会覆盖。如果您希望每次运行时覆盖该文件,则应首先在变量中收集所有输出,然后在循环结束后输出。以下脚本可以做到这一点,并且还提供了更易读的解决方案(只是不那么花哨)
$table = @()
$comps = get-content c:\users\myusername\pcs.txt
foreach($comp in $comps) {
$table += get-wmiobject -class CIM_VideoController -namespace root/cimv2 -computername $comp | format-table SystemName, caption
}
$table > gpus.txt