如何在Powershell中将.exe执行的所有输出重定向?

27

我在 Powershell 中运行 psftp.exe,它是 PuTTy 的主页。我正在这样做:

$cmd = "psftp.exe"
$args = '"username@ssh"@ftp.domain.com -b psftp.txt';
$output = & $cmd $args

这个可以用;我正在打印出$output。但它只能捕获一些输出到那个变量中(比如“远程工作目录是[...]”),而将其他输出抛出到类似于以下错误类型的地方:

psftp.exe : Using username "username@ssh".
At C:\full_script.ps1:37 char:20
+         $output = & <<<<  $cmd $args
    + CategoryInfo          : NotSpecified: (Using username "username@ssh".:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

这个 "Using username ..." 等看起来像是普通的FTP消息。我该如何确保所有输出都被放入 $output 中?


如果你必须使用调用运算符(&)(如果直接运行psftp则不需要),那么参数必须是一个数组,例如'用户@域名','-b','文件.txt'。 - js2010
3个回答

23

问题在于一些输出被发送到了 STDERR,而在 PowerShell 中,重定向的工作方式与 CMD.EXE 不同。

如何将控制台程序的输出重定向到文件中 提供了对此问题的良好描述和巧妙的解决方法。

基本上,使用可执行文件作为参数调用 CMD。像这样:

更新

我修复了我的代码,所以它现在可以正常工作。 :)

$args = '"username@ssh"@ftp.domain.com -b psftp.txt';
$output = cmd /c psftp.exe $args 2`>`&1

没有在$cmd细节周围加引号吗?我尝试过了,但是Powershell似乎现在卡住了。 - JBurace
谢谢,它有点起作用了,因为它没有将任何输出解析到 STDERR 中。但是,现在的问题是,“Using username ...” 等内容不在 $output 中出现。你的代码中是否有这个意图? - JBurace
我没有 PSFTP.EXE 进行测试,所以我使用了 PSEXEC.EXE$args = '-d' 进行测试。我会尝试用 PSFTP 测试一下。 - aphoria
我应该补充说明,我使用 PSEXEC 是因为我知道它会将一些输出写入 STDERR。 - aphoria
实际上我可能错了;我认为 STDERR 在那里。但是出现在 $output 字符串的末尾。这是有意为之吗? - JBurace
显示剩余2条评论

13

试一试

$output = [string] (& psftp.exe 'username@ssh@ftp.domain.com' -b psftp.txt 2>&1)

在PowerShell中有一个关于2>&1会生成错误记录的漏洞。使用[string]强制转换可以解决这个问题。


无法在PowerShell 2.0中使其工作。它会重定向到名为“1”的文件。 - 15ee8f99-57ff-4f92-890c-b56153
1
链接已失效。 - wp78de

1
& "my.exe" | Out-Null    #go nowhere    
& "my.exe" | Out-Default # go to default destination  (e.g. console)
& "my.exe" | Out-String  # return a string

管道将实时返回它。
& "my.exe" | %{    
   if ($_ -match 'OK')    
   { Write-Host $_ -f Green }    
   else if ($_ -match 'FAIL|ERROR')   
   { Write-Host $_ -f Red }   
   else    
   { Write-Host $_ }    
}

注意: 如果执行的程序返回除0以外的任何退出码,管道将不起作用。您可以使用重定向运算符(例如2>&1)强制进行管道操作。

& "my.exe" 2>&1 | Out-String

sources:

https://dev59.com/GXI-5IYBdhLWcg3wpqQK#7272390

https://social.technet.microsoft.com/forums/windowsserver/en-US/b6691fba-0e92-4e9d-aec2-47f3d5a17419/start-process-and-redirect-output-to-powershell-window


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接