如何在 powershell 脚本中执行多个 cmdlet?

How to execute several cmdlets in powershell script?

我编写此脚本是为了获取有关我的虚拟机的一些信息。当我执行此脚本时,最后两个 cmdlet(行)不会执行,但当我单独执行它们时,它们 运行 正确。

Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3" | Select-Object DeviceID, SystemName, 
@{n='Size (GB)'; e={$_.Size / 1GB -as [int]}}, 
@{n='Freespace (GB)'; e={$_.Freespace / 1GB -as [int]}};
$TotalMemory = (Get-CimInstance Win32_OperatingSystem).TotalVisibleMemorySize / (1024*1024)
$UsedMemory = (Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory / (1024*1024)
$TotalMemory = [math]::Round($TotalMemory,2)
$UsedMemory = [math]::Round($UsedMemory,2)
$TotalMemory
$UsedMemory
Get-CimInstance Win32_Processor | Select-Object -Property NumberOfCores;
Get-CimInstance Win32_Processor | Measure-Object -Property LoadPercentage -Sum | Select-Object Sum;

问题是什么? 如有任何意见,我们将不胜感激。

这似乎是 PowerShell 的怪癖之一。我不确定为什么会这样,但如果有人这样做,我会很乐意编辑我的答案以包含它。

您需要明确告诉它把输出写入控制台。有几种方法可以做到这一点。

第一个,可能也是最麻烦的,是将它作为参数传递给 Write-HostWrite-Output

Write-Host (Get-CimInstance Win32_Processor | Select-Object -Property NumberOfCores)
Write-Host (Get-CimInstance Win32_Processor | Measure-Object -Property LoadPercentage -Sum | Select-Object Sum)

(另一种方法是将它们都分配给变量,然后将变量传递给 cmdlet)

第二种方法是将其通过管道传输到 Write-HostWrite-Output

Get-CimInstance Win32_Processor | Select-Object -Property NumberOfCores | Write-Host
Get-CimInstance Win32_Processor | Measure-Object -Property LoadPercentage -Sum | Select-Object Sum | Write-Host

最后,第三种(在我看来也是最干净的)方法是将其通过管道传输到直接引用 属性

的代码块
Get-CimInstance Win32_Processor | %{$_.NumberOfCores}
Get-CimInstance Win32_Processor | Measure-Object -Property LoadPercentage -Sum | %{$_.Sum}

希望对您有所帮助!

这个问题已经被问了一百万次了。 Format-table 是隐式的 运行,它不能很好地处理不同的列集。所有的对象都在那里。您可以将整个脚本通过管道传输到格式列表。您可以将 get-date 放在最开始。一个以格式文件开头的已知对象修复了它。您可以使用第一个对象输出 4 个以上的属性。前阵子试过要求加警告:format-table should at least warn when it doesn't display properties #7871

看起来 out-gridview 也有类似的问题: