【问题标题】:Not showing Table of Objects until after Pause直到暂停后才显示对象表
【发布时间】:2015-07-08 20:38:42
【问题描述】:

已尝试搜索互联网,但大多数结果仅显示当 PowerShell 控制台处于活动状态时人们不小心按了键。

我面临的问题是我将 Hyper-V 对象存储在一个变量中并调用该变量。

以下 sn-p 来自我的脚本。

$ListDisks = Get-VMHardDiskDrive -VMName $VMName -ControllerType SCSI

"The following table will show which disks have been attached to the VM!" | Write-Host

$ListDisks
Pause

因此,当脚本执行时,它会运行并按预期显示所有输出。当我点击脚本的暂停部分时会出现问题。 Get-VMHardDiskDrive 输出直到我点击“按 Enter 继续...”后才会出现

输出:

The following table will show which disks have been attached to the VM!

Press Enter to continue...: 
VMName  ControllerType ControllerNumber ControllerLocation DiskNumber Path                                
------  -------------- ---------------- ------------------ ---------- ----                                
SOME-VM SCSI           0                0                  15         Disk 15 1.00 GB Bus 0 Lun 0 Target 0
SOME-VM SCSI           1                0                  28         Disk 28 1.00 GB Bus 0 Lun 0 Target 0
SOME-VM SCSI           2                0                  30         Disk 30 1.00 GB Bus 0 Lun 0 Target 0
SOME-VM SCSI           3                0                  16         Disk 16 1.00 GB Bus 0 Lun 1 Target 0

这不是一个超级大问题,我只是想知道为什么这种行为只发生在暂停时。如果我删除暂停,则不会发生问题。为什么会出现这种情况?

**编辑 - 忘记补充了,我在 Windows Server 2012 R2 中使用了带有 Hyper-V Cmdlet 的 PowerShell ISE。我使用 F5 运行脚本并在 ISE 控制台中手动调用脚本。使用常规 PowerShell 控制台时不会出现问题。

【问题讨论】:

  • 我只是尝试重现该问题,但改用了 Get-NetAdapter cmdlet。输出符合预期,因此这似乎特定于您正在运行的 SCSI 命令。
  • 我也做了与@RaviThapliyal 相同的操作,但不同的功能和响应按逻辑响应顺序排列。也许尝试做一个Write-Host $ListDisks 看看它是否在暂停前强制它进入控制台。
  • 或通过管道将其发送到 Out-GridView 之类的东西,恕我直言,这样的东西更棒。

标签: powershell output command-line-interface hyper-v powershell-4.0


【解决方案1】:

这似乎是 ISE 的问题。如果我在 ISE 中运行您的代码,我可以重现您描述的行为,而在常规 PowerShell 中运行时它可以正常工作。众所周知,ISE 和常规 PowerShell 的行为略有不同,因为它们是不同的主机环境。

您可以通过强制执行主机输出来解决此问题,例如像这样:

$ListDisks | Out-Host
pause

但是,通常您应该avoid writing to the host,除非它是为了向用户呈现数据,因为设计和定义的主机输出不会转到任何 PowerShell 的output streams,因此无法进一步处理。

如果您的脚本旨在在常规 PowerShell 控制台中运行,我不会费心解决这个 ISE 怪癖。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,但使用了Get-DnsServerResourceRecord。不要使用Write-Host,只需将其通过管道传输到Format-Table -AutoSize。这将允许Format-Table 收集数据并正确格式化,允许脚本以受控方式处理数据流。

    我在这里找到了解决方案:PowerShell Write-Host not synchronous

    【讨论】:

      猜你喜欢
      • 2014-06-30
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多