在Powershell中确定windows-shell命令何时完成

时间:2011-02-22 01:44:21

标签: powershell windows-shell

我正在编写一个PowerShell脚本来压缩文件目录,然后通过FTP将其发送到远程位置。 我正在使用shell应用程序创建zip文件。

我遇到的问题是 CopyHere 命令立即返回,并且副本发生在另一个线程上。显然,在创建zip文件之前,我无法开始FTP传输。

如何确定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 个答案:

答案 0 :(得分:4)

为什么不使用其他同步解决方案,例如7ZipPowerShell Community Extenions? PSCX在7Zip周围提供了一组方便的cmdlet包装器。两者都是免费的,并且是同步的,例如:

Write-Zip dirToZip dir.zip

答案 1 :(得分:-1)

迟到的答案,但你可以试试这个

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