我有一个小用例,我需要压缩目录内的每个目录(子目录是平面的,所以不用担心递归),尝试使用 PS 中的简单一行代码执行此操作,结果没有任何结果,我甚至无法调试。话虽如此,但对于 Powershell 我还很陌生。
这是我目前正在使用但无效的方法:
$directories = Get-ChildItem -Path . -Directory
foreach($directory in $directories) { Compress-Archive -Path $directory.FullName -DestinationPath "$($directory.FullName).zip" }
控制台短暂闪烁,提示 zip 命令已运行,但没有输出 - 我只是试图写入目标目录所在的同一目录。我已经进行了健全性检查,以查看我是否在对象上使用正确的属性,并且 foreach 循环产生了我期望的结果:
$directories = Get-ChildItem -Path . -Directory
foreach($directory in $directories) { echo $directory.FullName }
作为另一项健全性测试,我创建了一系列虚拟目录,其中包含一个小文件,遵循一个简单的方案,增加一个后缀整数。例如:test1,test2等。并做了一个类似的测试,但使用for循环:
for($num = 1; $num -le 3; $num++) { Compress-Archive ".\test$num\" "test$num.zip" }
它确实正确地从测试目录中生成了 zip 文件。我很困惑为什么 foreach 循环遍历获取调用的结果Get-ChildItem
没有受到欢迎,因为Compress-Archive
我可以验证它确实遍历了每个目录。
答案1
对我的特定用例的回答是Compress-Archive
需要使用-LiteralPath
参数而不是-Path
参数。