PowerShell调用外部EXE时重定向符号被传递给程序的问题求助
PowerShell调用外部程序时重定向输出的问题解决
问题根源
你在代码里把CMD风格的重定向符号(>>、2>&1)作为参数传给了FileMeta.exe,但PowerShell的重定向是Shell层面的语法,不是外部程序的参数。如果把这些符号放到参数列表里,PowerShell不会解析它们,只会直接传递给exe,导致exe把 >>当成要处理的文件名,自然会报错“无法找到文件”。
另外你手动给参数加引号的操作也是多余的——PowerShell会自动处理带空格的路径,手动添加的引号会被当作参数的一部分传给exe,可能引发额外的路径解析错误。
解决方案
- 移除所有和重定向相关的参数($parm4、$parm5、$parm6)
- 在调用FileMeta.exe的语句末尾,直接使用PowerShell的重定向语法:
>> $logFileName 2>&1 - 删除参数中手动添加的引号,让PowerShell自动处理路径空格
修正后的完整代码
$metaDataPath = 'M:\metadata_XML_tobe' $timeStr = Get-Date -Format 'yyyyMMdd-HHmmss' $logFileName = Join-Path -Path $metaDataPath -ChildPath "apply_doc_id_$timeStr.log" $files = Get-ChildItem -Path $metaDataPath -Recurse -Include *.xml $hits = 0 foreach ($f in $files){ $hits++ if ($hits -ge 5) { break } $directory = [System.IO.Path]::GetDirectoryName($f) $realFile_name = $f.FullName.Replace('.metadata.xml', '') $realFile_name = $realFile_name.Replace('\metadata_XML_tobe', '' ) # 去掉手动添加的引号,PowerShell会自动处理带空格的路径 $parm1 = '-i' $parm2 = "-f=$directory" $parm3 = $realFile_name Write-Host '**************' Write-Host $f.FullName Write-Host ' Parm1 = ' $parm1 Write-Host ' Parm2 = ' $parm2 Write-Host ' Parm3 = ' $parm3 # 调用exe并使用PowerShell原生重定向 & 'C:\Program Files\File Metadata\FileMeta.exe' $parm1 $parm2 $parm3 >> $logFileName 2>&1 }
关键修改说明
- 用
Join-Path替代字符串拼接生成日志路径,更安全可靠 - 删除了手动添加的引号参数,避免将引号传给exe
- 把重定向语法移到调用语句末尾,由PowerShell解析处理,而非作为exe参数传递
2>&1在PowerShell中同样表示将错误输出重定向到标准输出,和CMD的语义一致
内容的提问来源于stack exchange,提问作者jc508
相关产品推荐
相关产品推荐

