Powershell Invoke-команда с выводом 7zip

#powershell #7zip #invoke-command

#powershell #7zip #команда вызова

Вопрос:

У меня есть скрипт, который я использую как для резервного копирования, так и для восстановления zip-файлов из общего сетевого ресурса, и для этого я использую командную строку 7zip. Первым шагом в процессе восстановления является то, что я копирую файлы из хранилища резервной копии локально на компьютер, на который я собираюсь восстанавливать файлы. Затем я запускаю команду 7ip, используя C:temp папка в качестве начального пути и папка, в которую она должна перейти (C:usersusername …) для конечного пути. Я использую «-bsp1» для вывода процентного вывода, и если я запускаю его непосредственно со своего компьютера по пути UNC, я могу управлять курсором, чтобы он оставался на месте, а процент продолжал расти. Если я делаю это удаленно, проценты уменьшаются в строке, и у меня нет способа получить вывод в виде потока и сохранить процентное соотношение.

Вот код, когда я делаю это прямо со своего компьютера:

 amp; "C:program files7-zip7z.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 с моей машины на UNC-путь 2 машин и является «посредником». Я хотел бы запустить 7-zip непосредственно с компьютера, на котором перемещаются файлы, чтобы ускорить процесс. Я бы хотел, чтобы вывод выглядел так же, но не могу понять, как заставить это работать с помощью invoke-command. Вот что у меня есть до сих пор, и проценты просто уменьшаются в строке

 $Script = {amp; "C:program files7-zip7z.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%
 

Как мне сделать так, чтобы процент оставался рядом с «…»?

Спасибо!

Ответ №1:

Просто передайте вывод Invoke-Command в foreach блок, который у вас уже есть в вашем локальном коде:

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

Комментарии:

1. Большое спасибо за то, что помогли отцепить мой мозг. Я смотрел на это слишком много раз.