Powershell system.io.compression压缩文件和/或文件夹

时间:2013-11-19 09:13:49

标签: powershell io compression system

我在工作中生成一些自动化任务,我需要压缩某些文件和/或文件夹。 我想要做的是获取zip文件夹1中包含4个txt文件的文本文件。

执行此命令会出错,但仍然会压缩txt文件:

Exception calling "CreateFromDirectory" with "4" argument(s): "The directory name is invalid.
"
At line:15 char:13
+             [System.IO.Compression.ZipFile]::CreateFromDirectory($Source, "$Sour ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException

我现在得到的是:

[Reflection.Assembly]::LoadWithPartialName( "System.IO.Compression.FileSystem" )
$includeBaseDirectory = $false
$compressionLevel= [System.IO.Compression.CompressionLevel]::Optimal

$source = "C:\folder1\*"
Get-ChildItem $source -include *.txt  |
Foreach {
        $Source = $_.fullName
        [System.IO.Compression.ZipFile]::CreateFromDirectory    ($Source, "$Source.zip",$compressionLevel, $includebasedirectory)
        }

另外如果我想压缩folder1中的文件夹,我使用-directory switch而不是include。 这不会产生任何错误消息。 有什么建议吗?

1 个答案:

答案 0 :(得分:5)

@DavidBrabant是正确的,将通配符放在路径中是不正常的,但我认为你可以在这个实例中通过foreach语句来管理结果。

我认为问题是CreateFromDirectory的第一个参数应该是目录名,但是你已经传递了一个文件名。使用变量名称($ Source和$ source)确实没有帮助。

当您致电CreateFromDirectory时,由于以下行,它将包含第一个zip文件的全名:

$Source = $_.fullName

我猜测你有一个过滤器'* .txt',你想要将单个文件而不是整个文件夹添加到一个zip文件中,那么它会更复杂一些。请参阅此处以获取示例:http://msdn.microsoft.com/en-us/library/hh485720(v=vs.110).aspx

但如果您只是想压缩文件夹,请使用:

$sourceFolder = "C:\folder1"
$destinationZip = "c:\zipped.zip" 
[Reflection.Assembly]::LoadWithPartialName( "System.IO.Compression.FileSystem" )
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourceFolder, $destinationZip)