Powershell 等待压缩完成

Powershell 等待压缩完成

我编写了一个 PowerShell 脚本,用于压缩文件夹的内容并将其发送到服务器进行备份。问题是复制过程不会等待压缩过程完成。我尝试使用Out-NullWait-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 命令行客户端等程序来完成工作并等待其完成。

相关内容