PowerShell调用7-Zip打包选中目录 保留相对结构排除子目录
PowerShell调用7z仅打包目标文件夹一级文件、保留目录结构实现方案
原有命令直接将文件夹全路径传给7z时,7z默认开启递归遍历,会把文件夹下所有层级的子目录内容全部打包,不符合需求。以下两种通用方案都可以实现预期效果,不限制文件扩展名,压缩包内保留目标文件夹名\直接文件的结构:
方案一:使用7z内置参数关闭递归(代码最简洁)
7z压缩命令自带-r-参数用于完全关闭目录递归,逐次向7z传入目标文件夹下的通配符路径即可,不需要额外做文件筛选:
# 先筛选出名称匹配规则的目标文件夹 $targetDirs = Get-ChildItem "C:\users\user\appdata\local\folder" -Directory | Where-Object { $_.Name -like "*folder*" } foreach ($dir in $targetDirs) { # 传入文件夹下所有直接内容的通配符,-r-关闭递归,自动保留一级目录结构 & "C:\program files\7-zip\7z.exe" a "D:\TestBackup\Zipfile.7z" (Join-Path $dir.FullName "*") -r- }
参数说明:
-r-:强制关闭7z的递归遍历逻辑,仅处理传入路径下直接存放在根层级的文件,不会进入任何子目录- 传入
文件夹路径\*格式的路径时,7z会自动将父文件夹名作为压缩包内的一级目录,正好匹配预期结构 - 通配符
*匹配所有类型文件,不需要单独指定扩展名,通用性强
方案二:PowerShell预筛选一级文件(逻辑更灵活)
如果需要额外增加文件筛选规则(比如按修改时间、文件大小过滤),可以先用PowerShell精准筛选出所有需要打包的一级文件,再传入7z压缩,通过切换工作目录保证压缩包内路径结构正确:
# 筛选匹配规则的文件夹下,所有直接存放在根目录的文件,-Depth 1限制仅遍历1层,-File参数仅返回文件对象 $packFiles = Get-ChildItem -Path "C:\users\user\appdata\local\folder\*folder*" -File -Depth 1 # 切换到根目录作为工作路径,避免压缩包内出现完整C盘绝对路径 Push-Location "C:\users\user\appdata\local\folder" & "C:\program files\7-zip\7z.exe" a "D:\TestBackup\Zipfile.7z" $packFiles.FullName # 还原原工作目录 Pop-Location
注意:原有筛选命令里的匹配规则
"*folder*缺少闭合双引号,运行时会触发PowerShell语法错误,使用时需要补全为"*folder*"。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

