hack のためのネタ帳, etc,,,

目的

bash で
command >&2
として、標準出力を標準エラー出力に変更したり
command 2>&1
として、標準エラー出力を標準出力に変更したり
command 2>/dev/null
として、標準エラー出力を捨てたり
という事を PowerShell でやりたい。

方法

powershell redirect error null」でググったところ以下のページを。

基本、UNIX 系の shell と同様らしいが、
  • /dev/null の代わりは $null
  • 「標準○○出力」ではなく「○○ストリーム」と呼ぶらしい
    • 「標準出力」 →「サクセスストリーム」1
    • 「標準エラー出力」 →「エラーストリーム」2
    • これらに加えて「ワーニングストリーム」3、「冗長ストリーム」4、「デバッグストリーム」5、「インフォメーションストリーム」6 まであるらしい

しかし、bash で
command 2>&1 >/dev/null
のようにして、
標準エラー出力に標準出力の fd (file descriptor: ファイルディスクリプタ、またはファイル記述子)を割り当て、
標準出力に /dev/null を割り当てることで
元々の標準出力を捨てて、元々の標準エラー出力を標準出力に回す
というような使い方が上手くできないようで、以下のような結果になる。
> Test-NetConnection ::1 -Port 80 |% { echo "[$($_)]" }
警告: TCP connect to (::1 : 80) failed
[TestNetConnectionResult]
> Test-NetConnection ::1 -Port 80 3>&1 |% { echo "[$($_)]" }
[TCP connect to (::1 : 80) failed]
[TestNetConnectionResult]
> Test-NetConnection ::1 -Port 80 >$null 3>&1 |% { echo "[$($_)]" }
> Test-NetConnection ::1 -Port 80 3>&1 >$null |% { echo "[$($_)]" }
>
見ての通り、標準出力を捨てると、標準出力に回した出力も一緒に捨てられてしまうという結果。

また、bash だと以下のようにして標準出力と標準エラー出力を交換(つまり stdout と stderr を swap)することが出来るがこれも出来ない。
command 3>&1 1>&2 2>&3
具体的には
> Test-NetConnection ::1 -Port 80 1>&3 |% { echo "[$($_)]" }
発生場所 行:1 文字:35
+ Test-NetConnection ::1 -Port 80 1>&3 |% { echo "[$($_)]" }
+                                   ~
リダイレクト演算子の後にファイルが指定されていません。
発生場所 行:1 文字:35
+ Test-NetConnection ::1 -Port 80 1>&3 |% { echo "[$($_)]" }
+                                   ~
アンパサンド (&) 文字は許可されていません。& 演算子は、今後使用するために予約されています。アンパサンドを二重引用符で囲
み ("&")、文字列の一部として渡してください。
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingFileSpecification

のように m>&n という記述において n == 1 以外は Windows 10 で現状標準の PowerShell 5.1.18362.752 だとエラーになるようだ。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます