远程批量Powershell视频适配器查询

时间:2014-03-17 18:05:54

标签: windows powershell wmi

我试图编写一个powershell脚本来报告域的给定范围内所有计算机使用的视频卡(GUM1到GUM150)。 我实际上成功地让机器通过远程PowerShell报告他们的视频卡,但有两个问题;

  1. 不按照在txt列表中定义的顺序查询(或报告?)机器。

  2. 主页名不会被报告回来,这意味着我有一个混乱的结果列表,没有相应的机器名。

  3. 这是我到目前为止所做的事情;

    $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和主机名。

    有什么想法吗?

1 个答案:

答案 0 :(得分:2)

欢迎来到SO。您的脚本有一些问题需要处理。

  1. 您正在呼叫在服务器列表上调用一个WMI查询。您将变量命名为$comp,但它包含comps数组,-computername参数不接受计算机名列表。您可以使用foreach循环来解决此问题。
  2. 您正在尝试访问不存在的WMI类的属性。使用文档查找所需的实际属性http://msdn.microsoft.com/en-us/library/aa388668(v=vs.85).aspx(machinename不是属性)
  3. 实现第一个点后,无需尝试对对象进行排序,您的循环将遍历文本文件,查询计算机,并按照pcs.txt中指定的顺序附加结果
  4. 这一个班轮将负责所有这些:

    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