我需要使用PowerShell归档一个文件夹,但要排除某些子文件夹和文件。我的文件/文件夹排除可以出现在任何层次结构中。为了解释这一点,以WinForms VS项目为例进行简单说明。如果我们在VS中打开并构建它,VS会创建带有可执行内容的bin/obj子文件夹,带有用户设置的隐藏.vs文件夹,以及可能是解决方案包含的*.user文件。我想对这样一个VS解决方案文件夹进行归档,而不包括那些可以在下次构建解决方案时重新创建的文件和文件夹项目。
使用7-Zip很容易完成此操作,只需使用其-x!命令行开关即可。
执行此脚本后,排除列表仅适用于第一层级别的子文件夹。如果在我的脚本中添加“-Recurse”开关到Get-ChildItem cmdlet或尝试使用Where-Object过滤文件/文件夹,则会在归档中丢失文件夹层次结构。
是否有解决方案? 我需要仅使用PowerShell解决问题,不使用任何外部工具。
使用7-Zip很容易完成此操作,只需使用其-x!命令行开关即可。
"C:\Program Files\7-Zip\7z.exe" a -tzip "D:\Temp\WindowsFormsApp1.zip" "D:\Temp\WindowsFormsApp1\" -r -x!bin -x!obj -x!.vs -x!*.suo -x!*.user
然而,我无法编写出等效的PowerShell脚本。我最好得到的东西是下面这样的:
$exclude = "bin", "obj", ".vs", "*.suo", "*.user"
$files = Get-ChildItem -Path $path -Exclude $exclude -Force
Compress-Archive -Path $files -DestinationPath $dest -Force
执行此脚本后,排除列表仅适用于第一层级别的子文件夹。如果在我的脚本中添加“-Recurse”开关到Get-ChildItem cmdlet或尝试使用Where-Object过滤文件/文件夹,则会在归档中丢失文件夹层次结构。
是否有解决方案? 我需要仅使用PowerShell解决问题,不使用任何外部工具。
Copy-Item
复制文件,然后再压缩以保持层次结构。 - Santiago Squarzon-Exclude
,因为它非常不直观,可以参考这个答案。使用Where-Object
更加简单明了。我相信它可以在不丢失文件夹层次结构的情况下使用。如果一切都失败了,请使用@SantiagoSquarzon提供的建议。 - zett42-Recurse
参数可以全局保留层次结构,但会复制文件。我建议在PowerShell中使用.NET ZipArchive.CreateEntry和递归函数来实现您的期望。 - HazrelleCompress-Archive
时(就像Get-ChildItem -recurse
一样),你会丢失目录层次结构。这在文档的 示例部分 中有提到。我会按照 @Hazrelle 的建议使用ZipArchive
。 - zett42