Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 重新创建写入进度功能_Powershell - Fatal编程技术网

Powershell 重新创建写入进度功能

Powershell 重新创建写入进度功能,powershell,Powershell,我有一个调用外部exe文件msdl.exe的脚本,这是我为windows编译的 下载时的输出如下所示: download [ MechHand-1.wmv ] Host: [ 132.68.3.150:554 ] connected! Host: [ 132.68.3.150:554 ] connected! Speed: 2.000 DL: 815061/313870475 B -- 0% 150.2K/s # this line updates

我有一个调用外部exe文件msdl.exe的脚本,这是我为windows编译的

下载时的输出如下所示:

download [ MechHand-1.wmv ]
Host: [ 132.68.3.150:554 ]    connected!
Host: [ 132.68.3.150:554 ]    connected!
Speed: 2.000
DL: 815061/313870475 B --   0%            150.2K/s     # this line updates
我用于从脚本中调用exe的行是:

cmd /c .\msdl.exe -s2 $address -o $filename '2>&1'
我已将脚本编译为exe,以便在客户端计算机上运行。 但是,当作为exe运行时,进度行不会覆盖自身,而是每次都是新行,如下所示:

download [ MechHand-1.wmv ]
Host: [ 132.68.3.150:554 ]    connected!
Host: [ 132.68.3.150:554 ]    connected!
Speed: 2.000

DL: 82992/313870475 B --   0%                          0B/s
DL: 158076/313870475 B --   0%                         158.1K/s
DL: 233160/313870475 B --   0%                         158.1K/s
DL: 301987/313870475 B --   0%                         143.9K/s
DL: 377071/313870475 B --   0%                         143.9K/s
我认为我需要的是将执行msdl.exe的命令的输出通过管道传输到foreach循环中,并根据行的内容定期打印它(比如说download[filename]),或者覆盖前一行

但是,如果我对输出进行管道化处理,我担心的是它将首先运行命令,这可能需要很长时间(取决于文件大小),然后在完成后立即显示进度,而不是在生成时显示输出

这是否有效,或者我如何复制所需的行为


PS:stderr重定向是因为MSDL写入stderr,虽然在运行脚本时这并不重要,但在运行exe时,每一行都以红色打印,并以“ERROR:”作为前缀。

首先,您能否放弃对
cmd
的调用,在PowerShell中执行?其次,将输出导入一个
ForEach对象
循环,每次有输出时,清除主机,只显示您想要显示的内容。例如,您可以将前5行保存为in banner变量。然后可以显示横幅和输出行

& .\msdl.exe -s2 $address -o $filename | ForEach-Object {$i=0} {
   Clear-Host
   $Banner 
   if ($i -le 5) {
        $Banner += $_
   }
   $_
   $i++
}

我会试试看这是否能达到预期效果,谢谢。至于横幅-下载多个文件时,一旦文件完成,横幅行可能会返回。有没有办法切换进线的内容(例如,它以“DL”开头),然后追加?通过
进行的调用也会在powershell中打印出一个异常,同时通过
cmd
进行调用会产生更清晰的输出。这似乎接近于给出所需的行为,谢谢。