我编写了一个 PowerShell 脚本,用于压缩文件夹的内容并将其发送到服务器进行备份。问题是复制过程不会等待压缩过程完成。我尝试使用Out-Null
和Wait-Process
,但似乎没有任何效果。 Out-Null
只是不执行任何操作,并Wait-Process
告诉我不存在这样的过程。我似乎无法弄清楚 Windows 压缩的进程名称。任何帮助都将不胜感激。以下是我希望暂停直到完成的代码部分。
function out-zip {
Param([string]$path)
if (-not $path.EndsWith('.zip')) {$path += '.zip'}
if (-not (test-path $path)) {
set-content $path ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
}
$ZipFile = (new-object -com shell.application).NameSpace($path)
$input | foreach {$zipfile.CopyHere($_.fullname)}
}
gi "C:\File-Backups\Share1" | out-zip C:\File-Backups\transfer\PC1-Backup
答案1
你确定代码真的能将文件压缩成有效的 zip 格式吗?它似乎对我没什么用。(编辑:哦,它有用?太棒了!)
无论如何,无论如何回答你的问题,Out-Null 不会做任何事情,因为它是 Out-Null...并且 Wait-Process 不会做任何事情,因为你没有运行进程。
您想要的是 Powershell Jobs。
开始工作
http://technet.microsoft.com/en-us/library/hh849698.aspx
等待工作
http://technet.microsoft.com/en-us/library/hh849735.aspx
编辑 2:此外,看起来您正在使用 Powershell v3!
[Reflection.Assembly]::LoadWithPartialName( "System.IO.Compression.FileSystem" )
$src_folder = "D:\stuff"
$destfile = "D:\stuff.zip"
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
$includebasedir = $false
[System.IO.Compression.ZipFile]::CreateFromDirectory($src_folder,$destfile,$compressionLevel, $includebasedir )
在最后一行周围放置一个 foreach 来适当压缩每个文件,或者无论您想怎么做,然后将整个内容包装为 Start-Job 的输入。
答案2
执行压缩的进程是 Explorer,即 Windows shell(因此,您不能等待该进程退出,因为它一直在运行)。
这是一篇博客文章,其中有一些代码扩展了您的示例,并使用文件锁测试来确定压缩何时完成:
http://www.technologytoolbox.com/blog/jjameson/archive/2012/02/28/zip-a-folder-using-powershell.aspx
否则,您正在考虑使用一些不使用资源管理器的 PowerShell 外部 zip 库,或者调用 7-Zip 命令行客户端等程序来完成工作并等待其完成。