使用PS将文件夹中的文件压缩为zip文件

Dav*_*.ca 7 powershell

我有以下脚本将文件夹(文件夹中的所有文件)压缩为zip文件:

 set-content $zipFileName ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
 $ZipFile = (new-object -com shell.application).NameSpace($zipFileName) 
 Get-ChildItem $folder | foreach {$zipFile.CopyHere($_.fullname)} 
Run Code Online (Sandbox Code Playgroud)

其中$ folder ="C:\ Test",$ zipFileName ="C:\ data\test.zip"为例

如果"C:\ Test"不包含空的子文件夹,它可以正常工作,并且它似乎递归地压缩子文件夹中的所有文件.我真的很喜欢上面简单的线条脚本.例如:

C:\Test
   file1.dat
   file2.dat
   Test-Sub
      File21.bat
      ....
Run Code Online (Sandbox Code Playgroud)

但是,我在一个案例中得到了错误.我发现如果有任何空文件夹,例如"C:\ Test\EmptySub",

C:\Test
   file1.dat
   file2.dat
   Test-Sub
      File21.bat
      ....
   EmptySub
   AnotherSub
      file31.sp1
      ...
Run Code Online (Sandbox Code Playgroud)

该脚本将生成错误.我尝试了以下脚本:

Get-ChildItem $files -Recurse | foreach { if (!$_.PSIsContainer) 
    {$zipFile.CopyHere($_.fullname)}} 
Run Code Online (Sandbox Code Playgroud)

这不能按预期工作.它只是跳过所有子文件夹.不确定是否有可用的跳过所有空子文件夹的过滤器或子句?

更新:根据建议,我试了一下.我的问题还没有解决.这是我的问题的更新.首先,我更新了上面的脚本,以显示如何创建$ zipFile对象.其次,我有建议的代码:

Get-ChildItem $files | ? {-not ($_.PSIsContainer -eq $True -and 
  $_.GetFiles().Count -eq 0) } | % {$zipfile.CopyHere($_.fullname)}
Run Code Online (Sandbox Code Playgroud)

我在我的WindowsXP上尝试了以上更新,它可以正常使用空子文件夹.但是,相同的代码在Windows 2003 Server中不起作用.以下是错误消息:

[窗口标题]压缩(压缩)文件夹错误

[内容]找不到文件或没有读取权限.

[好]

不确定此类型的PK对象是否在Windows 2003服务器中有效,或者是否存在该对象的其他设置.

zda*_*dan 3

您可以通过测试 get-childitem 的空返回来检测空目录。例如,这将返回空目录列表

dir | where{$_.PSIsContainer -and -not (gci $_)}
Run Code Online (Sandbox Code Playgroud)

尽管在你的情况下,你想要相反的:

Get-ChildItem $files | where{-not ($_.PSIsContainer -and -not (gci $_))} | foreach {$zipfile.CopyHere($_.fullname)}} 
Run Code Online (Sandbox Code Playgroud)