带有 7zip 输出的 Powershell 调用命令

问题描述

我有一个脚本,用于从网络共享备份和恢复 zip 文件,我使用命令行 7zip 来执行此操作。还原过程的第一步是将文件从本地备份位置复制到我要将文件还原到的计算机。然后我使用远程机器的 C:\temp 文件夹作为开始路径和它需要转到的文件夹 (C:\users\username...) 作为结束路径运行 7ip 命令。我正在使用“-bsp1”来给出百分比输出,如果我直接从我的机器运行它到 UNC 路径,我可以控制光标保持不动,百分比继续上升。如果我远程执行,百分比会成直线下降,我无法将输出视为流并使百分比保持不变。

这是我直接从我的机器上执行时的代码

& "C:\program files\7-zip\7z.exe" "x" $copiedFolder -o"$RemoteFolder" -aoa "-bsp1" | out-string -stream | Select-String -Pattern "\d{1,3}%" -AllMatches | ForEach-Object { $_.Matches.Value } | foreach {
    [System.Console]::SetCursorPosition(0,[System.Console]::CursorTop) 
    Write-Host -NoNewline "Unzipping [$fold]..."$_
    }  
    Write-Host -ForegroundColor Green " Completed"

这会产生以下结果:

Unzipping [Backup Folder]...10%

并且在保持不变的情况下它会上升到 100%。

我遇到的问题是,从我的机器运行 7-zip 到 2 台机器的 UNC 路径并且成为“中间人”的速度非常慢。我想直接从正在移动文件的机器上运行 7-zip,以加快进程。我希望输出看起来相同,但无法弄清楚如何使用 invoke-command 使其工作。这是我到目前为止所拥有的,百分比只是直线下降

$Script = {& "C:\program files\7-zip\7z.exe" "x" $using:copiedFolder -o"$using:RemoteFolder" -aoa "-bsp1" | Select-String -Pattern "\d{1,3}%" -AllMatches  | ForEach-Object { $_.Matches.Value } }
Invoke-command -Computer $Adcomp -Scriptblock $Script

这是输出

Unzipping [Backup Folder]...0%
0%
1%
2%
3%
4%
4%
4%
5%
6%
7%
8%
9%
10%
11%
12%
13%

如何使百分比保持在“...”旁边?

谢谢!

解决方法

只需将 Invoke-Command 的输出通过管道传输到本地代码中已有的 foreach 块:

Invoke-command -Computer $Adcomp -Scriptblock $Script | foreach {
    [System.Console]::SetCursorPosition(0,[System.Console]::CursorTop) 
    Write-Host -NoNewline "Unzipping [$fold]..."$_
}