web-dev-qa-db-ja.com

Powershellで.exe実行のすべての出力をパイプする方法は?

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

17
JBurace

問題は、いくつかの出力がSTDERRに送信されており、リダイレクトの動作がCMD.EXEとPowerShellで異なることです。

PowerShellでコンソールプログラムの出力をファイルにリダイレクトする方法 には、問題の適切な説明と巧妙な回避策があります。

基本的に、実行可能ファイルをパラメーターとしてCMDを呼び出します。このような:

更新

実際に動作するようにコードを修正しました。 :)

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

これを試してみてください

$output = [string] (& psftp.exe 'username@[email protected]' -b psftp.txt 2>&1)

PowerShellがあります bug about 2>&1エラー記録を作成します。 [string] castはそれを回避します。

8
Andy Arismendi