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

问题描述

| 我使用以下脚本将文件夹(文件夹中的所有文件)压缩为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)} 
其中$ folder = \“ C:\\ Test \”,而$ zipFileName = \“ C:\\ data \\ test.zip \”例如 如果\“ C:\\ Test \”不包含空的子文件夹,它将很好地工作,并且似乎可以递归地压缩子文件夹中的所有文件。我真的很喜欢上面的简单脚本。例如:
C:\\Test
   file1.dat
   file2.dat
   Test-Sub
      File21.bat
      ....
但是,在一种情况下我出错了。我发现如果有任何空文件夹,例如\“ C:\\ Test \\ EmptySub \”,
C:\\Test
   file1.dat
   file2.dat
   Test-Sub
      File21.bat
      ....
   EmptySub
   AnotherSub
      file31.sp1
      ...
该脚本将产生一个错误。我尝试了以下脚本:
Get-ChildItem $files -Recurse | foreach { if (!$_.PSIsContainer) 
    {$zipFile.CopyHere($_.fullname)}} 
这不能按预期方式工作。它只是跳过所有子文件夹。不确定是否有过滤器或子句可用于跳过所有空子文件夹? 更新:根据建议,我尝试了一下。我的问题尚未解决。这是我的问题的更新。首先,我更新了上面的脚本以显示$ zipFile对象的创建方式。其次,我有建议的代码:
Get-ChildItem $files | ? {-not ($_.PSIsContainer -eq $True -and 
  $_.GetFiles().Count -eq 0) } | % {$zipfile.CopyHere($_.fullname)}
我在WindowsXP上尝试了上述更新,它与空白子文件夹一起正常工作。但是,相同的代码在Windows 2003 Server中不起作用。以下是错误消息: [窗口标题] 压缩(压缩)文件夹错误 [内容] 找不到文件或没有读取权限。 [好] 不知道此类型的PK对象是否可在Windows 2003 Server中使用,或者该对象是否具有其他设置。     

解决方法

您可以通过测试get-childitem的空返回值来检测空目录。例如,这将返回空目录列表
dir | where{$_.PSIsContainer -and -not (gci $_)}
尽管您的情况是相反的:
Get-ChildItem $files | where{-not ($_.PSIsContainer -and -not (gci $_))} | foreach {$zipfile.CopyHere($_.fullname)}} 
    ,在获得任何子项(包括文件夹)的意义上,代码都是递归工作的。如果您打算排除空文件夹,则应过滤它们: 尝试以下一种衬垫: gci $ folder |` ? {-非($ _。PSIsContainer -eq $ True -and $ _。GetFiles()。Count -eq 0)} |` %{$ zipfile.CopyHere($ _。fullname)}     ,这是我创建的用于压缩文件的功能。之所以会出现读取错误,是因为.CopyHere是异步复制过程,因此我的脚本会先验证该zip文件中是否存在该文件,然后再继续下一个要压缩的文件:
function Out-ZipFile ([string]$path) 
{ 
    try
    {
        $files = $input

        if ($path.StartsWith(\".\\\")) { $path=$path.replace(\".\\\",\"$($pwd)\\\") }
        if (-not $path.Contains(\"\\\")) { $path=\"$($pwd)\\$($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) 
        $files | % { 
            $FileName = $_.name
            \"Adding $FileName to $path\"; 
            $ZipFile.CopyHere($_.fullname);  
            While (($ZipFile.Items() | where { $_.Name -like $FileName }).Size -lt 1) { Start-Sleep -m 100 };
        } 
    }
    catch
    {
        write-output \"Error Encountered: `n$_\"
        return $_
        throw
    }
}
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...