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

vya*_*vya 3 compression io powershell system

我在工作时会产生一些自动化任务,需要压缩某些文件和/或文件夹。我正在尝试做的是压缩包含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
Run Code Online (Sandbox Code Playgroud)

我现在得到的是:

[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)
        }
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*tin 5

@DavidBrabant是正确的,将通配符放在路径中是不正常的,但是我认为在这种情况下您可以避免使用通配符,因为您正在通过foreach语句传递结果。

我相信问题在于,CreateFromDirectory的第一个参数应该是目录名,但是您已将其传递给文件名。变量名称($ Source和$ source)的使用并没有真正帮助。

调用时CreateFromDirectory,由于以下原因,它将包含第一个zip文件的全名:

$Source = $_.fullName
Run Code Online (Sandbox Code Playgroud)

我猜想,当您有一个过滤器'* .txt'时,您想将单个文件而不是整个文件夹添加到一个zip文件中,这会涉及到更多内容。参见此处的示例:http : //msdn.microsoft.com/zh-cn/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)
Run Code Online (Sandbox Code Playgroud)