我正在编写一个大脚本,用于扫描 AD 中计算机的 WMI 信息。我有用于 diskinfo、raminfo 和 videocardinfo 的函数,其中磁盘和视频卡具有相似的输出样式。问题是,根据脚本运行它们的顺序,其中一个输出为空白。以下是两个函数:
函数 Get-DiskInfo {
$disk = Get-WMIObject Win32_Logicaldisk -ComputerName $computer |
Select @{Name="Computer";Expression={$computer}}, DeviceID,
@{Name="SizeGB";Expression={$_.Size/1GB -as [int]}},
@{Name="FreeGB";Expression={[math]::Round($_.Freespace/1GB,2)}}
Write-Host $Computer
$disk
}
和:
函数 Get-VRamInfo {
$vram = Get-WmiObject win32_videocontroller -ComputerName $computer |
Select @{Name="Computer";Expression={$computer}},
@{Name="VideoRAM";Expression={$_.adapterram / 1MB}},
Name
Write-Host $computer
$vram
}
一个将获得预期的输出,但脚本中稍后运行的输出将仅输出计算机名称,但不输出任何信息
完整脚本如下:https://gist.github.com/ErkkaKorpi/f1b10a62ac79763fa38082b6c25e8f1b
可能是什么问题呢?
答案1
由于一些不为人知的原因,Write-Output
命令记住自定义对象第一次/上一次使用时的属性,以供下次使用,甚至应用于另一个(不同定义的)自定义对象。不幸的是,我不知道如何重置记住的属性。
有一个解决方法:使用方法Format-Table
如下。(请注意,为了更好地理解,我添加了SizeGB
注释属性Get-VRamInfo
。)
Function Get-DiskInfo {
$disk = Get-WMIObject Win32_Logicaldisk -ComputerName $computer |
Select-Object @{Name="Computer";Expression={$computer}},
DeviceID,
@{Name="SizeGB";Expression={$_.Size/1GB -as [int]}},
@{Name="FreeGB";Expression={[math]::Round($_.Freespace/1GB,2)}}
#Write-Host $Computer -ForegroundColor Magenta
$disk
}
Function Get-VRamInfo {
$vram = Get-WmiObject win32_videocontroller -ComputerName $computer |
Select-Object @{Name="Computer";Expression={$computer}},
@{Name="VideoRAM";Expression={$_.adapterram / 1MB -as [int]}},
@{Name="SizeGB";Expression={$_.adapterram/1GB -as [int]}},
Name
#Write-Host $computer -ForegroundColor Cyan
$vram
}
$computer = '.'
"`nshrunk output #1"
Get-VRamInfo
Get-DiskInfo
"`nfull output"
Get-VRamInfo | Format-Table
Get-DiskInfo | Format-Table
"`nshrunk output #2"
Get-DiskInfo
Get-VRamInfo
输出:
PS D:\PShell> D:\PShell\SF\884809.ps1
shrunk output #1
Computer VideoRAM SizeGB Name
-------- -------- ------ ----
. 2048 2 NVIDIA GeForce GT 740
. 111
. 932
. 0
full output
Computer VideoRAM SizeGB Name
-------- -------- ------ ----
. 2048 2 NVIDIA GeForce GT 740
Computer DeviceID SizeGB FreeGB
-------- -------- ------ ------
. C: 111 58.06
. D: 932 856.47
. E: 0 0
shrunk output #2
Computer DeviceID SizeGB FreeGB
-------- -------- ------ ------
. C: 111 58.06
. D: 932 856.47
. E: 0 0
. 2
Write-Output
cmdlet 通常用于脚本中,以在控制台上显示字符串和其他对象。但是,由于默认行为是在管道末尾显示对象,因此通常不需要使用 cmdlet。
例如,Get-Process | Write-Output
相当于Get-Process
。