PowerShell按文件名指定分段匹配复制文件问题求助
PowerShell按文件名独立分段复制文件的解决方案
原代码的问题
你的代码会复制所有文件,核心原因是:
$filepath = Get-ChildItem $path\*.*获取的是所有文件的集合,后续$String = $filepath.Name把所有文件名合并成了一个数组,拆分后循环时只要有任意一个文件的分段匹配805,就会执行copy-item $filepath $copypath,直接复制所有文件。- 没有针对单个文件做判断,而是批量处理了所有文件的名字。
修改后的方案(两种可选)
方案1:延续你拆分文件名的思路
逐个遍历文件,对每个文件的名字拆分后检查是否有独立的"805"分段:
$path = "Z:\QNAP\EH\powershell" $copypath = "Z:\QNAP\EH\powershell\copy\" # 遍历目录下的每个文件 Get-ChildItem $path\*.* | ForEach-Object { # 拆分当前文件的名字,分隔符是_和. $splitSegments = $_.Name.Split("_.") # 检查拆分后的分段里是否存在完全等于"805"的项 if ($splitSegments -contains "805") { # 复制当前符合条件的文件 Copy-Item $_.FullName -Destination $copypath } }
方案2:用正则表达式直接匹配(更简洁)
通过正则匹配文件名中被_或.包围的"805",确保它是一个独立分段:
$path = "Z:\QNAP\EH\powershell" $copypath = "Z:\QNAP\EH\powershell\copy\" # 筛选出文件名包含独立分段805的文件,再复制 Get-ChildItem $path\*.* | Where-Object { $_.Name -match '(?:^|_)805(?:_|$|\.)' } | Copy-Item -Destination $copypath
正则说明:
(?:^|_):匹配文件名开头,或者下划线(确保805前面是分隔符或开头)805:目标匹配内容(?:_|$|\.):匹配下划线、文件名结尾,或者点号(确保805后面是分隔符或结尾)
这两种方案都能精准匹配你需要的两个文件,不会误复制包含"080500032"的文件。
内容的提问来源于stack exchange,提问作者Tomas
相关产品推荐
相关产品推荐

