Windows 11 PowerShell zip 文件(排除的文件和文件夹路径除外)

Windows 11 PowerShell zip 文件(排除的文件和文件夹路径除外)

我正在尝试使用 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}\*"

相关内容