tk555 diary

プログラミング、もしくはそれ以外のこと書きます。

PowerShellで'echo a > a(1).txt'とかやりがち

経緯

powershellping 8.8.8.8 > ping(8.8.8.8).txt とかやろうとしたらちょっとハマった。
bashだとエラー吐いてくれるけどpowershellだと素直に通っちゃう。



ミス1こめ

PS> echo a > a(1).txt

とすると

PS> ls
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/09/22      3:33              8 a

PS> cat a
a

a(1).txtはa((1).txt)と解釈されて(1)はtxtプロパティ等を持たないので何も帰らず'a'となる。(多分)
パズルかな?


ミス2こめ

PS> echo a > a(echo a).txt

とすると

PS> ls
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/09/22      3:29              8 a

で中身が

PS> cat a
a

上と同様に(echo a).txtは"a".txtと解釈されてリダイレクトされるファイル名は'a'となる。$(ダラー)入れるとうまくいく。


ミス3こめ

PS> echo a > a`(echo a`).txt

とすると

PS> ls
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/09/22      3:31             24 a(echo

で中身が

PS> cat '.\a(echo'
a
a).txt


これは
powershellではバッククオートで括弧をエスケープできる。
②リダイレクト後にも引数を続けて入力できる。
例:echo a > b c d e
(bという名前のファイルに'echo a c d e'の標準出力をリダイレクトする。

で結果的に
echo 'a' 'a).txt' > 'a(echo'
と同じ。

デフォルトでpowershellだとecho a a aは改行区切り。bashだと空白区切り。

おわりに

いやー難しいっすねPowerShell
素直にout-fileとかでフォーマット記法使ったほうが明確なのかとか思った。
ネットワークの勉強したかったのに時間が溶けた...