PowerShellで'echo a > a(1).txt'とかやりがち
経緯
powershellでping 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とかでフォーマット記法使ったほうが明確なのかとか思った。
ネットワークの勉強したかったのに時間が溶けた...