Get-ExecutionPolicy が Restricted な PowerShell (Windows 7) な環境でのスクリプト実行
権限がまったくないWindows 7マシンで PowerShell 2.0 環境でプログラムを書こうとして悪戦苦闘したので、備忘録を記述。
まず、Restrictedな環境では.ps1で保存したPowerShell Scriptは動作しない。このため、バッチファイルを作成し、そこにスクリプトファイルを Drag & Drop することで実行できるようにした。
run.bat としてデスクトップに作成。
PowerShell -Sta -WindowStyle Hidden -Command "Get-Content %1 | Invoke-Expression"
デバッグ用は debug.batとしてデスクトップに。
PowerShell -Sta -Command "Get-Content %1 | Invoke-Expression" Pause
PowerShell 2.0 では MTA(Multi-Threaded Apartment)モードにデフォルトでなっているため、.NET FrameWork の CommonDialog クラスが使えない。回避するため -Sta とした。CommonDialog は OpenFileDialog や FolderBrowserDialog があるので、使えないと困る。次の -WindowStyle Hidden は、コマンドラインの PowerShell プログラムを非表示にするため。私は GUI プログラムにしか興味がないので、コマンドラインは消えてなくなってほしい。そして、 -Command 以下に実行する PowerShell コマンドレットを書くことになる。
バッチファイルの引数は %1 になるので、Get-Content %1 でPowerShell スクリプトファイルを読み込み一行ずつパイプラインで送っていく。次に Invoke-Expression で一行ずつコマンドレットを実行する。
この方法の問題は、if 文だろうが関数だろうが、全て一行で記述しなければならないこと(ワンライナーってやつ)。コマンドレットのステートメント区切りはセミコロン ; なので、関数内やif文で複数の命令を実行する場合は、セミコロンで区切った長い行になってしまう。何かいい方法がないか探しているところ。
もうひとつの問題は、空白行を使うと、
Invoke-Expression : 引数が空の文字列であるため、パラメーター 'Command' にバインドできません。
なんてエラーが出るので、行頭に#を付けてコメント行にする必要がある。これで、多少は見やすいスクリプトになった。
というところで、ウィンドウを表示するだけのプログラムをひとつ。
FirstForm.ps1というファイルで作成してみた。
Add-Type -Assembly System.Windows.Forms $w = New-Object System.Windows.Forms.Form $w.ShowDialog()
なんとなく動作している。