You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell调用外部EXE时重定向符号被传递给程序的问题求助

PowerShell调用外部程序时重定向输出的问题解决

问题根源

你在代码里把CMD风格的重定向符号(>>、2>&1)作为参数传给了FileMeta.exe,但PowerShell的重定向是Shell层面的语法,不是外部程序的参数。如果把这些符号放到参数列表里,PowerShell不会解析它们,只会直接传递给exe,导致exe把 >>当成要处理的文件名,自然会报错“无法找到文件”。

另外你手动给参数加引号的操作也是多余的——PowerShell会自动处理带空格的路径,手动添加的引号会被当作参数的一部分传给exe,可能引发额外的路径解析错误。

解决方案

  1. 移除所有和重定向相关的参数($parm4、$parm5、$parm6)
  2. 在调用FileMeta.exe的语句末尾,直接使用PowerShell的重定向语法:>> $logFileName 2>&1
  3. 删除参数中手动添加的引号,让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:07:21