Powershell 脚本在第二个函数上输出空白

Powershell 脚本在第二个函数上输出空白

我正在编写一个大脚本,用于扫描 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-Outputcmdlet 通常用于脚本中,以在控制台上显示字符串和其他对象。但是,由于默认行为是在管道末尾显示对象,因此通常不需要使用 cmdlet。
例如, Get-Process | Write-Output相当于Get-Process

答案2

查看您的脚本,您没有定义$computer,因此对于任何这些函数,它都会立即出错。定义后,我可以确认第二个函数在 Windows 10 1703 上使用时可以正常返回适配器:

在此处输入图片描述

从输出中可以看出,$vram已经包含您的计算机名称,因此您可能需要跳过Write-Host $Computer部分。

正如我看到的那样,您似乎正在同时检查许多台机器,因此查看 PowerShell 工作流是有意义的,它允许并行执行您的任务,因此您可以在循环中使用您的函数ForEach -Parallel并使其执行得更快。

相关内容