PowerShell脚本按文件名规则复制文件异常:所有文件均被复制
解决PowerShell脚本复制全部文件的问题
我来帮你搞定这个脚本问题!你的代码现在会复制整个文件夹内容的核心原因是:你在Copy-Item里传入的是源文件夹路径$source,而不是当前遍历到的单个文件$file。这样不管文件是否匹配规则,每次判断都会触发整个文件夹的复制,自然会把所有内容都拷贝过去。
修正后的基础版本
下面是修复后的代码,我还做了几个小优化让逻辑更清晰:
$source = "E:\GatewaysRenditionArea\pdf" # 加上-File参数,只遍历文件夹里的文件,排除子文件夹 $fileList = Get-ChildItem -Path $source -File ForEach ($file in $fileList) { # 用文件名称匹配更精准,不需要用到完整路径 if ($file.Name -like "*PID*.pdf") { # 复制当前符合条件的单个文件,而不是整个源文件夹 Copy-Item -Path $file.FullName -Destination "E:\Gateway\GatewaysStagingArea\PID - Piping and Instrumentation Diagram" } elseif ($file.Name -like "*BOM*.pdf") { Copy-Item -Path $file.FullName -Destination "E:\Gateway\GatewaysStagingArea\BOM - Bill of Materials" } }
关键修改点:
- 目标路径修正:把
Copy-Item的-Path从$source改成$file.FullName,确保只复制当前匹配的单个文件。 - 过滤文件类型:给
Get-ChildItem加上-File参数,避免遍历源文件夹里的子文件夹(如果有的话)。 - 匹配逻辑优化:用
$file.Name代替$file.FullName做匹配,因为我们只需要检查文件名是否包含关键词,路径部分不影响判断。
更高效的优化版本
如果你的源文件夹文件较多,直接用Get-ChildItem的过滤参数可以减少遍历次数,代码也更简洁:
$source = "E:\GatewaysRenditionArea\pdf" $pidDestination = "E:\Gateway\GatewaysStagingArea\PID - Piping and Instrumentation Diagram" $bomDestination = "E:\Gateway\GatewaysStagingArea\BOM - Bill of Materials" # 直接过滤PID文件并复制 Get-ChildItem -Path $source -File -Filter "*PID*.pdf" | Copy-Item -Destination $pidDestination # 直接过滤BOM文件并复制 Get-ChildItem -Path $source -File -Filter "*BOM*.pdf" | Copy-Item -Destination $bomDestination
这个版本利用PowerShell的管道特性,先筛选出符合条件的文件,再直接传递给Copy-Item,省去了手动遍历判断的步骤,执行效率更高。
内容的提问来源于stack exchange,提问作者Kenny
相关产品推荐
相关产品推荐

