我正在尝试使用 PowerShell 进行压缩,但它没有排除 中列出的文件excluded_paths
。我想特别排除__pycache__
可以嵌套在我的 Python 代码库不同级别的所有文件夹实例。目前所有内容都会被压缩,包括应该排除的文件和文件夹。
$excluded_paths = @(
"${parent_folder}/.vscode/*",
"${parent_folder}/.git/*",
"${parent_folder}/temp/*",
"${parent_folder}/resources/documentation/*",
"${parent_folder}/**/useful/*",
"${parent_folder}/scripts/*",
"${parent_folder}/*.template.*",
"${parent_folder}/*TODO.*",
"${parent_folder}/$(Get-Item -Path $MyInvocation.MyCommand.Path).Name"
)
$exclude_pycache = Get-ChildItem -Path $parent_folder -Recurse -Directory -Filter "__pycache__" | ForEach-Object { $_.FullName }
$excluded_paths += $exclude_pycache
Pause
$winrar_path = "C:\Program Files\WinRAR\WinRAR.exe"
#$exclusion_switches = $excluded_paths | ForEach-Object { "-x'$_'" }
#& $winrar_path a -r -ep1 $exclusion_switches "$output_zip" "${parent_folder}\*"
$exclusion_string = $excluded_paths -join ' '
& $winrar_path a -r -ep1 "-x$exclusion_string" "$output_zip" "${parent_folder}\*"
我尝试了这个:
$exclusion_switches = $excluded_paths | ForEach-Object { "-x'$_'" }
& $winrar_path a -r -ep1 $exclusion_switches "$output_zip" "${parent_folder}\*"
并尝试了这个:
$exclusion_string = $excluded_paths -join ' '
& $winrar_path a -r -ep1 "-x$exclusion_string" "$output_zip" "${parent_folder}\*"
即使是一个简单的例子:
& $winrar_path a -r -x__pycache__ "$output_zip" "${parent_folder}\*"
不起作用。它可以压缩但不会排除所有__pycache__
文件夹。
好的,我试过了
& $winrar_path a -r "-x*__pycache__*" "$output_zip" "${parent_folder}\*"
这有效,但是WinRAR 文档没有提到引用它。
我究竟做错了什么?
答案1
试试这个。需要根据您的对象进行编辑。
pushd $PSScriptRoot
$exc_paths = @('.vscode', '.git', 'temp', 'resources', '__pycache__')
$exc_exten = @('.ps1')
$ToZip = GCI -R | ? {$_.Name -notin $exc_paths -and $_.Extension -notin $exc_exten}
$rar = "C:\Program Files\WinRAR\Rar.exe"
& $rar a -r $ToZip.Name
pause
使用7-Zip
$7z = "C:\Program Files\7-Zip\7z.exe"
& $7z a -r -aoa $ToZip.Name
选择
如果只有一个文件夹需要压缩,只需CMD
创建一个附加文本文件Exclude.txt
并在其中写入要排除的文件/文件夹名称。
@echo off
set parent="C:\temp\parent"
set SevenZ="C:\Program Files\7-Zip\7z.exe"
%SevenZ% a -tzip archive.zip %parent% [email protected]
pause
笔记:
set parent=..
用父文件夹替换变量-tzip
:档案类型(7z、zip、rar 等)archive.zip
: 档案名称Exclude.txt
:要排除的文件/文件夹列表,每个文件/文件夹用新行分隔。- 批处理脚本在外面
%parent%
,Exclude.txt
在脚本旁边。
Exclude.txt 的内容(示例):
_pycache_
.git
scripts
image.png
使用 速度更快CMD
。但是,如果您仍想使用PowerShell
:
$parent = 'C:\temp\parent'
$SevenZ = "C:\Program Files\7-Zip\7z.exe"
& $SevenZ a -tzip 'archive.zip' $parent -xr@'Exclude.txt'
pause
答案2
找到了奇怪的解决方案。如果要递归删除,则必须像这样冗余地定义它-x*\scripts -x*\scripts\*
。对于带点的文件或文件夹,请使用单引号,例如.git
文件夹。
& $winrar_path a -r '-x*\.git' '-x*\.git\*' '-x*.gitignore' -x*\__pycache__ -x*\__pycache__\* -x*\scripts -x*\scripts\* -x*\documentation -x*\documentation\* "$output_zip" "${parent_folder}\*"