#PowerShellを.Batのように使うメモ
PowerShellがオジちゃんたちに受け入れられない理由の一つに「ダブルクリックで実行できない」「ドラッグアンドドロップで実行できない」というのがあります。
いや、設定すればできるけどね。
ちなみにダブルクリックで実行できないのはPowerShellなんでもできるからです。
レジストリの書換からファイルのネットワーク送信まで何でもござれなので。
忙しい人向け
.ps1ファイルのショートカットを作成し、ショートカットのリンク先の先頭に以下を追加
powershell -NoProfile -ExecutionPolicy RemoteSigned -File
手順
- ps1ファイルのショートカットを作成する。
- ショートカットのプロパティを開く
- ps1ファイルのパスが記載されたリンク先に「コマンド」を追加する
上記の手段でバッチな操作が可能。
コマンドは必要に応じて書き換える必要があるので下で解説します。
追加するコマンドについて
おそらく毎回おまじないのように使うのは以下のコマンド
powershell -NoProfile -ExecutionPolicy RemoteSigned -File
これをショートカットのリンク先の先頭に追加します。
ざっくり説明すると……
-
powershell
- PowerShellを起動
-
-NoProfile
- オプションでデフォルトのプロファイルを指定
-
-ExecutionPolicy RemoteSigned
- オプションで実行ポリシーを指定
-
-File
- オプションで実行する.ps1ファイルを指定
-ExecutionPolicy RemoteSigned
に関してPowerShellのデフォルトではps1ファイルの実行が許可されていないので一時的に許可するというオプションになります。
-File
の指定先がローカルでない場合は-ExecutionPolicy
の設定をUnrestricted
に変更して下さい。
状況に応じて追加するオプション
-
-NoExit
- Script終了後、ウィンドウを残す。
-
-WindowStyle Hidden
- Script実行時、ウィンドウを立ち上げない。
- 正確には立ち上げた瞬間、隠れるというのが正しい気も・・・
-
-NonInteractive
- Script実行時、ユーザーの入力を受け付けない。
-
-NoLogo
- Script開始時、著作権情報を表示しない。
-File
のあとに追加すると駄目なので注意
パラメータの受け取り方
上記を設定することで、ダブルクリックでの実行やドラッグアンドドロップでの実行が可能になります。
ドラッグアンドドロップしたファイルはパス情報が[System.Object]の配列として$Argsに格納されます。
以下確認用のScript
echo "実行されました。"
$Args | foreach{
echo $_.GetType()
$item = Get-Item -LiteralPath $_
echo "パラメータ:" $item.FullName
}
echo "終了しました。"
実行されました。
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
パラメータ:
D:\[test] サンプル 1.txt
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
パラメータ:
D:\[test] サンプル 2.txt
終了しました。
注意点
Argsの並び順が不定
ルールがありそう…だけど順序が重要な場合は基本的には受け取ったあとにソートが必要。
ファイル名にスペース
正確にはPowerShellのハマりポイントなんですけど、ファイル名に半角スペース等の文字が含まれている場合、そのままパラメータとして渡すと区切り文字として解釈されるケースがあります。
Path情報として引数に渡す際には-LiteralPath
オプション等を行うようにしてください。
詳しくは公式を見てください。