【问题标题】:How to pipe all output of .exe execution in Powershell?如何在 Powershell 中通过管道传输 .exe 执行的所有输出?
【发布时间】:2013-03-04 10:52:32
【问题描述】:

在 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

这个“使用用户名...”等看起来像一个普通的 FTP 消息。如何确保所有输出都放入$output

【问题讨论】:

    标签: powershell output


    【解决方案1】:

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

    How to redirect output of console program to a file in PowerShell 很好地描述了问题并提供了巧妙的解决方法。

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

    更新

    我修复了我的代码,使它能够真正工作。 :)

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

    【讨论】:

    • $cmd 详细信息周围没有引号?我试过了,但 Powershell 现在似乎挂了。
    • 谢谢,这有点奏效,因为它没有将任何输出解析为 STDERR。但是现在$output 中没有“使用用户名...”等,似乎无处可寻。使用您的代码,您是否打算这样做?
    • 我没有PSFTP.EXE 进行测试,所以我使用PSEXEC.EXE$args = '-d' 进行测试。我看看能不能用PSFTP试试。
    • 我应该补充一点,我使用的是PSEXEC,因为我知道它会将部分输出写入 STDERR。
    • 其实我可能搞错了;我认为 STDERR 就在那里。但出现在 $output 字符串的末尾。有意?
    【解决方案2】:

    试试这个

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

    有一个 PowerShell bug 关于 2&gt;&amp;1 制作错误记录。 [string] 演员围绕它工作。

    【讨论】:

    • 无法让它在 PowerShell 2.0 中工作。它重定向到一个名为1的文件。
    • 链接已失效。
    猜你喜欢
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多