我有以下脚本将文件夹(文件夹中的所有文件)压缩为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服务器中有效,或者是否存在该对象的其他设置.
您可以通过测试 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)
| 归档时间: |
|
| 查看次数: |
11380 次 |
| 最近记录: |