80

du.exe (元々は Sysinternals のDisk Usage ) を使用してディレクトリのサイズを計算する PowerShell スクリプトがあります。

コンソールで実行du c:\Backupすると期待どおりに動作しますが、ISE または PowerGui で同じコード行を実行すると、期待される結果に加えてエラーが発生します。

+ du <<<<  c:\backup
+ CategoryInfo          : NotSpecified: (:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

何故ですか?このエラーを回避するにはどうすればよいですか? を使用して呼び出し式を試し&ましたが、うまくいきませんでした。

助けてくれてありがとう。

4

5 に答える 5

54

これを回避するには、stderr を null にリダイレクトします。例:

du 2> $null

基本的に、コンソール ホストと ISE (およびリモート処理) は stderr ストリームを異なる方法で扱います。コンソール ホストでは、PowerShell が edit.com などのアプリケーションをサポートし、色付きの出力やエラーを画面に書き込む他のアプリケーションと連携することが重要でした。コンソール ホストで I/O ストリームがリダイレクトされない場合、PowerShell はネイティブ EXE に、直接書き込むためのコンソール ハンドルを提供します。これは PowerShell をバイパスするため、PowerShell はエラーが書き込まれたことを認識できないため、$error を介して、または PowerShell の stderr ストリームに書き込むことによってエラーを報告することはできません。

ISE とリモーティングはこのシナリオをサポートする必要がないため、stderr でエラーを確認し、その後エラーを書き込み、$error を更新します。

于 2010-01-19T17:45:04.920 に答える
47

出力を抑制する別の方法は、パイプライン内のオブジェクトを文字列NativeCommandErrorに変換することです (この回答の下部に概説されています) 。

du c:\Backup 2>&1 | %{ "$_" }
于 2014-01-06T12:49:48.247 に答える
2

以前の FIX はエラーをリダイレクトしますが、たとえばユーザー名またはパスワードが適切でない場合、または統合認証を使用している場合にアクセスできない場合、実際のエラーを失う可能性があります。

エラー処理を実装し、psexec によって発生した特定のエラー (エラーは 1 つではありません) をバイパスする方法を次に示します。

try {
    whoami # powershell commands
}
catch [System.Management.Automation.RemoteException] {
    if ($_.TargetObject -like "Connecting to *" -and $_.CategoryInfo.Category -eq "NotSpecified" -and $_.FullyQualifiedErrorId -eq "NativeCommandError" -and $_.InvocationInfo.MyCommand.Name -like "psexec*.exe") {
        $error.Remove[$Error[0]]
    }
    else {
        Throw
    }
}        
catch {
    throw
}

于 2017-02-17T20:30:46.790 に答える