#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. Большое спасибо за то, что помогли отцепить мой мозг. Я смотрел на это слишком много раз.