PowerShell脚本故障:XML文件无法按索引对应复制到Exception文件夹
问题分析与解决方案
问题根源
你的代码在XML文件复制环节存在两个核心问题:
- 索引不匹配:PowerShell集合的索引从0开始,但你的循环变量
$i从1启动,导致第一次循环取的是第2个XML文件,最后一次循环会因索引超出集合范围而无文件复制。 - 文件获取逻辑错误:
Get-Item –Path $TodaysFilePath -Filter *.xml无法正确获取所有XML文件——Get-Item仅返回单个对象,搭配-Filter无法遍历目录下所有XML,应该直接复用之前已获取的$XMLfiles变量,避免重复查询文件系统。
修正后的代码
$Source="C:\temp\" $TodaysDate = (Get-Date).ToString('yyyyMMdd') # AddDays(-0)可省略,等价于当前日期 $TodaysFilePath = Join-Path $Source $TodaysDate # 获取所有XML文件并统计数量 $XMLfiles = Get-ChildItem -Path $TodaysFilePath -Recurse -Filter *.xml $TotalXMLfiles = $XMLfiles.Count # 提前获取所有PDF文件,避免循环内重复查询 $PDFFiles = Get-ChildItem -Path $TodaysFilePath -Recurse -Filter *.pdf # 循环创建文件夹并复制文件 for ($i = 0; $i -lt $TotalXMLfiles; $i++) { # 生成Exception文件夹路径(序号从1开始) $ExceptionNum = $i + 1 $ExceptionFilePath = Join-Path $Source "$TodaysDate`_Exception$ExceptionNum" # 确保文件夹存在(若已创建可省略,添加后更稳妥) if (-not (Test-Path $ExceptionFilePath)) { New-Item -Path $ExceptionFilePath -ItemType Directory | Out-Null } # 复制所有PDF到当前Exception文件夹 $PDFFiles | Copy-Item -Destination $ExceptionFilePath -Force # 复制对应索引的XML文件($i为0起始,对应第i+1个XML) $XMLfiles[$i] | Copy-Item -Destination $ExceptionFilePath -Force }
关键优化点
- 复用
$XMLfiles和$PDFFiles变量,减少重复文件系统查询,提升执行效率。 - 用0起始索引匹配集合,通过
$i+1生成文件夹的序号(Exception1、Exception2...),完全匹配需求。 - 使用
Join-Path拼接路径,避免手动拼接字符串导致的路径格式错误。 - 增加
Test-Path检查文件夹是否存在,避免重复创建引发报错。
验证要点
执行后每个YYYYMMDD_ExceptionN文件夹会包含:
- 所有PDF文件
- 第N个XML文件(按
Get-ChildItem返回顺序,若需固定排序,可在获取$XMLfiles时添加| Sort-Object Name)
内容的提问来源于stack exchange,提问作者Unacress
相关产品推荐
相关产品推荐

