PowerShell将子文件夹名纳入文件名时出现路径错误求助
问题分析与解决方案
报错原因
- 第二个循环中多余的
-Recurse参数会遍历目标文件夹下所有子目录的temp.rpt,可能处理非预期文件,同时增加网络路径解析的不确定性。 - 通过管道传递文件对象给
Rename-Item时,网络共享路径的解析容易出现异常,导致找不到文件路径。 - 手动拼接路径时使用双反斜杠,虽然PowerShell兼容,但不符合规范,可能引发路径拼接错误。
修正后的脚本
# 定义目标根文件夹(使用单斜杠或单反斜杠,避免双反斜杠) $ActionTargetFolder = "\\networkdrive\2_ActionData_Prep\" # 获取所有子文件夹(使用-Directory参数更简洁,替代PSIsContainer判断) $GetAllActionTargetSubFolders = Get-ChildItem -Path $ActionTargetFolder -Recurse -Directory # 遍历每个子文件夹,合并.rpt文件到temp.rpt foreach ($folder in $GetAllActionTargetSubFolders) { # 构造temp.rpt的完整路径,用Join-Path避免手动拼接错误 $tempFilePath = Join-Path -Path $folder.FullName -ChildPath "temp.rpt" # 仅获取当前文件夹下的.rpt文件(去掉-Recurse,若需要合并子文件夹的.rpt则保留) Get-ChildItem -Path $folder.FullName -File -Filter "*.rpt" | Get-Content | Sort-Object | Get-Unique | Out-File -FilePath $tempFilePath -Force } # 遍历每个子文件夹,重命名temp.rpt foreach ($folder in $GetAllActionTargetSubFolders) { $tempFilePath = Join-Path -Path $folder.FullName -ChildPath "temp.rpt" # 检查temp.rpt是否存在,避免报错 if (Test-Path -Path $tempFilePath -PathType Leaf) { # 构造新文件名:子文件夹名_Consolidated_时间戳.rpt $newFileName = "$($folder.Name)_Consolidated_$(Get-Date -Format 'yyyyMMddHHmm').rpt" $newFilePath = Join-Path -Path $folder.FullName -ChildPath $newFileName # 直接使用路径参数重命名,避免管道解析问题 Rename-Item -LiteralPath $tempFilePath -Destination $newFilePath -Force } }
关键修改点
- 使用
-Directory参数替代Where-Object { $_.PSIsContainer -eq $true },更简洁高效。 - 用
Join-Path构造文件路径,避免手动拼接的错误,尤其是网络路径。 - 去掉第二个循环中的
-Recurse,仅处理当前子文件夹下的temp.rpt,符合需求。 - 增加
Test-Path检查文件是否存在,避免因文件缺失导致报错。 - 直接指定
-LiteralPath和-Destination参数进行重命名,避免管道传递文件对象时的路径解析问题。 - 时间戳改用
HH(24小时制),避免12小时制的歧义(可选修改)。
内容的提问来源于stack exchange,提问作者Hayco
相关产品推荐
相关产品推荐

