使用 PowerShell 创建一个函数来获取计算机阵列上的磁盘序列号

Using PowerShell to create a function that gets disk serial numbers on an array of computers

我目前正在尝试使用 PowerShell 创建一个函数,该函数会为我提供计算机列表及其磁盘驱动器序列号。我需要它显示在具有 2 列的散列 table 中。

这是我目前的功能。我认为通过创建对象并指定要获取和显示的成员,它会创建我需要的数组,但是当我 运行 函数时,我得到了一个输出,但 Disks 列仍然输出为数组对象。我需要把它变成一个散列table。我需要合并两者才能做到这一点吗?

function Get-DiskInventory {
    [string[]]$computers = $env:COMPUTERNAME

    foreach ($computer in $computers) {
        $system = Get-WmiObject win32_ComputerSystem -Computername $computer
        $disks = Get-WmiObject win32_DiskDrive -ComputerName $computer

        $computerobj = New-Object -TypeName PSCustomObject
        $computerobj | Add-Member -MemberType NoteProperty -Name Name -Value $computer

        #Gather Disk Info, collect mulitple disks
        $diskinfo = @()
        foreach ($disk in $disks) {
            $diskobj = New-Object -TypeName PSObject
            $diskobj | Add-Member -MemberType NoteProperty -Name SerialNumber -Value $disk.SerialNumber
            $diskinfo += $diskobj
        }

        #add disk collector to computer obj
        $computerobj | Add-Member -MemberType NoteProperty -Name Disks -Value $diskinfo

        $computerobj
    } #End foreach computer

} #End Fucntion

Get-DiskInventory

我认为您误解了哈希表的工作原理。哈希表本质上是字典,其中有一个唯一键列表和另一个对应值列表。如果我正确理解你的问题,你需要这样的输出:

ComputerName   SerialNumber
------------   ------------
ComputerA      1234...
ComputerA      3456...
ComputerB      9876...
ComputerB      7654...
...            ...

但你实际上得到的是这样的东西:

ComputerName   Disks
------------   ------------
ComputerA      {@{SerialNumber=1234...
ComputerB      {@{SerialNumber=9876...
...            ...

对于前一个输出,您不能使用哈希表,因为键(计算机名称)不是唯一的。不过,由于您的代码无论如何都不使用哈希表,所以这不是问题。

但是,您需要为每个磁盘创建不同的对象,而不是将一台计算机的所有磁盘添加到同一个对象。此外,WMI 对象已经有一个带有计算机名的 属性,并且 -ComputerName 参数接受一个数组作为输入,因此您应该能够将代码简化为如下所示:

function Get-DiskInventory {
  Param(
    [Parameter(Mandatory=$false)]
    [string[]]$computers = $env:COMPUTERNAME
  )

  Get-WmiObject Win32_DiskDrive -ComputerName $computers |
    Select-Object SystemName, SerialNumber
}