PowerShell移动.eml文件报错:文件不存在问题求助
问题描述
我生成了一个包含.eml文件路径列表的文本文件,想要把这些文件移动到其他位置,但因为生成方式的问题,列表里有重复项。我写了一段PowerShell脚本,变量显示正常,但执行时总是提示文件不存在,脚本和错误信息如下:
脚本代码
$filepath = 'G:\APPS\temp\Eric\Chris2.txt' $new = 'G:\APPS\temp\Eric\Rel-emails' $old = 'C:\a\b' $OldName = (GC -path $filepath -Raw) | Get-Unique ForEach ($item in $OldName) { $NewName = $OldName -replace [regex]::Escape("$old"),$new Move-item -Path $Item -Destination $NewName -WhatIf }
错误信息
' does not exist. At line:10 char:8 + Move-item -Path $Item -Destination "$NewName" -WhatIf + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [Move-Item], PSInvalidOperationException + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.MoveItemCommand
问题分析与修复方案
核心问题1:
Get-Content -Raw导致遍历逻辑错误
使用-Raw参数会把整个文本文件读取成单个字符串,Get-Unique处理后依然是一个长字符串。此时用ForEach ($item in $OldName)会把字符串拆成单个字符逐个遍历,$Item变成单个字符,自然找不到对应文件。核心问题2:替换操作未针对当前循环项
脚本中用$OldName -replace ...生成目标路径,而非当前循环的$Item,这会导致目标路径变成整个文本内容替换后的结果,完全不符合预期。修复后的脚本
$filepath = 'G:\APPS\temp\Eric\Chris2.txt' $newDir = 'G:\APPS\temp\Eric\Rel-emails' $oldBasePath = 'C:\a\b' # 按行读取文件、去重后遍历每个路径 Get-Content -Path $filepath | Get-Unique | ForEach-Object { # 针对当前路径生成目标路径 $targetPath = $_ -replace [regex]::Escape($oldBasePath), $newDir # 确保目标目录存在,不存在则创建 $targetDir = Split-Path -Path $targetPath -Parent if (-not (Test-Path -Path $targetDir)) { New-Item -Path $targetDir -ItemType Directory -Force | Out-Null } Move-Item -Path $_ -Destination $targetPath -WhatIf }
- 关键修复点说明
- 移除
-Raw参数,让Get-Content按行读取,Get-Unique可正确对每行路径去重。 - 使用
ForEach-Object遍历每行路径,$_代表当前处理的文件路径。 - 替换操作针对当前路径
$_生成正确的目标路径。 - 添加目标目录检查与创建逻辑,避免因目录不存在报错。
- 优化变量名,提升代码可读性。
- 移除
内容的提问来源于stack exchange,提问作者erobby
相关产品推荐
相关产品推荐

