我写了一个PowerShell脚本来压缩文件夹的内容并将其发送到服务器进行备份。 问题是复制过程不会等待压缩过程完成。 我已经尝试使用Out-Null
和Wait-Process
,并没有什么似乎工作。 Out-Null
只是不做任何事情, Wait-Process
告诉我没有这样的过程存在。 我似乎无法弄清楚Windows Compression的进程名称。 任何帮助将不胜感激。 下面是我想暂停的代码的一部分,直到它完成。
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
你确定代码实际上是将文件压缩成一个有效的zip格式吗? 它看起来不像对我有用。 (编辑:哦,它呢?整洁!)
无论如何,回答你的问题,无论Out-Null都不做任何事情,因为它是Out-Null …而Wait-Process没有做任何事情,因为你没有运行一个进程。
你想要的是Powershell作业。
启动工作
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放在最后一行,适当地压缩你的每一个文件,或者你想这样做,然后把整个东西作为开始工作的input。
进行压缩的过程是Explorer,Windows shell(因此,您不能等待进程因为它始终运行而退出)。
以下是一些博客文章,其中有一些代码扩展了您的示例,并使用文件lockingtesting来确定压缩何时完成:
http://www.technologytoolbox.com/blog/jjameson/archive/2012/02/28/zip-a-folder-using-powershell.aspx
否则,你正在使用PowerShell的一些外部zip库,它不使用浏览器,或者调用一个像7-Zip命令行客户端的程序来完成这个工作并等待它完成。