我有一个PowerShell脚本将本地vmware实例转换为远程AWS实例。此过程中的两个步骤是调用具有自己进度条的外部CLI程序。问题是他们没有正确显示。
单独运行时,vmware-vdiskmanager
会显示以下行,并在每个点完成时更新百分比编号。在PowerShell中调用时,每次更新百分点时都会得到一个新行,重复整个文本。
Convert: 0% done.
另一个步骤是ec2-import-instance
,它有一个稍微更漂亮的进度条。当它自己运行时,它会填充空间并更新百分比。从PowerShell,它永远不会更新。在作业完成之前,它只显示为静态。
0% |--------------------------------------------------| 100%
我的PowerShell脚本中的两个命令都将其输出通过管道输出到Out-Host。我不明白PowerShell如何与程序输出交互。我从来没有像批处理这样的问题,但是在这个过程中有一些步骤我需要真正的编程语言的力量。
知道发生了什么,或者如何让它像他们自己运行时那样展示?
编辑:举个例子,这是第一个命令。
vmware-vdiskmanager -r $filename -t 5 stream.vmdk | Out-Host
早期定义$ filename的逻辑很明显。它转换得很好,我只得到101行输出。
Creating disk 'stream.vmdk'
Convert: 0% done.
Convert: 1% done.
Convert: 2% done.
Convert: 3% done.
Convert: 4% done.
Convert: 5% done.
Convert: 6% done.
Convert: 7% done.
Convert: 8% done.
Convert: 9% done.
Convert: 10% done.
Convert: 11% done.
Convert: 12% done.
第二个例子不会更新输出。它有更多参数并引用一些环境变量。这就是我看到的输出。
Uploading the manifest file
Uploading 19979618816 bytes across 1906 parts
0% |--------------------------------------------------| 100%
|===================================================|
Done
Average speed was 1.378 MBps
我最好的猜测是像PowerShell不支持打印退格字符或定位外部可执行文件的输出,Out-Host是一个单向流。两种行为的差异可能是在外部程序本身中刷新输出的问题。我只是在这里猜测。
答案 0 :(得分:0)
当PowerShell捕获外部命令的输出时,似乎出现了问题。在这种情况下,管道输送到主机'导致PowerShell捕获输出。这种情况一次发生一行,由外部程序发出的CR触发。
在转换中:0%完成。'例如,应用程序在写入新行之前在每行之后发出CR。每行都作为换行符发送PowerShell,因此多行。
在'进度条中'例如,应用程序打印空进度条,然后发出CR以将光标放回到行的开头(PowerShell将其视为输出行)。然后应用程序将光标向右移动(某些控件字符 - 不确定是哪个),并且一次一个字符更新进度条直到完成。 PowerShell仅在完成后发布CR时才会看到此行,因此只有一行。
编辑:上述理论的替代方案是app使用退格序列将光标移动到条形的开头。这会触发PowerShell的新行,因为输出的字符数(包括退格)超出了控制台行长度。
我无法访问VMWare,但写了一个简短的控制台应用程序展示了我上面描述的行为。
如果您不需要捕获输出,只需在没有“外出主机”的情况下运行即可。并确保输出不包含在任何管道操作中。