Определить, когда команда windows-shell завершена в Powershell - PullRequest
1 голос
/ 22 февраля 2011

Я пишу сценарий powershell, чтобы сжать каталог файлов и затем отправить его в удаленное местоположение по FTP.Я создаю zip-файл с помощью приложения оболочки.

Проблема, с которой я столкнулся, заключается в том, что команда CopyHere немедленно возвращается, и копирование происходит в другом потоке.Очевидно, что я не могу начать передачу по FTP, пока не будет создан zip-файл.

Как определить, когда создание zip-файла завершено?

Пример кода:

if(test-path($destZipFilePath)) {
    remove-item $destZipFilePath;
}
set-content $destZipFilePath("PK" + [char]5 + [char]6 + ("$([char]0)" * 18));

$shellApp = new-object -com shell.application;
$zipFile = $shellApp.Namespace($destZipFilePath);
$zipSource = $shellApp.Namespace($fullDeployDirectory);

$zipFile.CopyHere($zipSource);
############################################################
# CopyHere is called asynchronously                        #
# I do not know how to determine if it has completed       #
# hence this horrible hack                                 #
############################################################

Start-Sleep -m 10000;

############################################################

$zipFile = $null
$zipSource = $null
$shellApp = $null


#Now we FTP the zipped file to the FTP servers

$ftpDest = "{0}/{1}" -f ($ftpAddress, $zipFileName);
$webClient = New-Object System.Net.WebClient;
$webClient.Credentials = New-Object System.Net.NetworkCredential($userName, $password);
$webClient.UploadFile($ftpDest, $$destZipFilePath);

Ответы [ 2 ]

4 голосов
/ 22 февраля 2011

Почему бы не использовать какое-либо другое синхронное решение, такое как 7Zip или PowerShell Community Extenions ? PSCX предоставляет удобный набор оболочек для командлетов вокруг 7Zip. Оба являются бесплатными и будут синхронными, например:

Write-Zip dirToZip dir.zip
0 голосов
/ 11 декабря 2015

поздний ответ, но вы можете попробовать это

[gc]::collect()
[gc]::WaitForPendingFinalizers()
...