如何使用PowerShell将匹配的压缩包复制到对应目录并解压?
PowerShell匹配编号压缩包与文件夹并解压的实现方案
你当前定义$R = "136" ; "287"的写法存在错误,实际执行后$R仅会被赋值为"136",第二个字符串"287"会直接输出到控制台,不会存入变量,需要先将待匹配编号改为数组格式。
完整实现逻辑如下:
- 第一步:定义基础配置,包括待处理编号数组、备份根目录路径
- 第二步:遍历所有zip压缩包,匹配对应编号的子文件夹
- 第三步:将压缩包复制到对应子文件夹,执行解压操作
# 定义需要处理的编号数组 $targetIds = @("136", "287") # 定义备份根目录路径 $backupRoot = "\\rossfsscan\scanning\ejbackup\" # 遍历所有目标编号 foreach ($id in $targetIds) { # 获取当前编号对应的zip压缩包 $zipFile = Get-ChildItem -Path $backupRoot -Filter "*$id*.zip" -File | Select-Object -First 1 # 获取当前编号对应的子文件夹 $targetDir = Get-ChildItem -Path $backupRoot -Filter "*$id*" -Directory | Select-Object -First 1 # 跳过匹配不到压缩包或文件夹的编号 if (-not $zipFile -or -not $targetDir) { Write-Warning "编号$id 未匹配到对应压缩包或文件夹,跳过处理" continue } # 复制压缩包到目标文件夹,需要移动的话替换为Move-Item即可 Copy-Item -Path $zipFile.FullName -Destination $targetDir.FullName -Force # 执行解压操作,-Force参数可覆盖已存在的同名文件,不需要可以删除 Expand-Archive -Path (Join-Path $targetDir.FullName $zipFile.Name) -DestinationPath $targetDir.FullName -Force # 如果解压完成后不需要保留子文件夹内的压缩包,可以取消注释下面一行删除 # Remove-Item -Path (Join-Path $targetDir.FullName $zipFile.Name) -Force }
注意事项
- 如果你的编号规则是文件名/文件夹名仅前缀为纯数字编号,可以把匹配逻辑替换为正则提取,避免模糊匹配出现错误,比如只匹配文件名开头的数字作为编号:
$id = [regex]::Match($zipFile.Name, '^\d+').Value - PowerShell 5.1及以上版本原生支持
Expand-Archive命令,低版本需要单独安装相关模块
内容的提问来源于stack exchange,提问作者Viktor Kursinszki
相关产品推荐
相关产品推荐

