使用 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
}
我目前正在尝试使用 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
}