ps1ファイルでコマンドを実行する様々な方法
#.ps1 #コマンド
普通にコマンド名を書いて、引数を並べるだけでもコマンド扱いになる
code:ps1
notepad ./foo.txt
文字列をコマンドとして実行するのであれば、頭に&をつける
code:ps1
&"C:\WINDOWS\system32\notepad.exe" ./foo.txt
文字列の中にコマンドを書く際は、$()で囲む
code:ps1
"$(C:\WINDOWS\system32\notepad.exe ./foo.txt)"
変数に入れた文字列をコマンドとして実行する際はInvoke-Expressionを使う
気をつけないと任意コード実行の脆弱性になるので注意
Invoke-Expression (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Learn
code:ps1
$command = "notepad ./foo.txt"
Invoke-Expression $command
実行するコマンドが決まっているのであれば、引数だけを変数で管理することで、Invoke-Expressionを避けられる
code:ps1
$arg = "./foo.txt"
notepad $arg
引数が複数あるのであれば、配列(PowerShell)に入れれば良い
code:ps1
$arg = @("-Pattern", 2)
echo 1,2,3 | Select-String $arg
ただし、万能ではないようで、配列を含んだ配列を引数にそのまま渡すことはできない模様
code:ps1
$arg = @("-Pattern", 2, "-Context", @(1,1))
echo 1,2,3 | Select-String $arg
Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Pattern'. Specified method is not supported.