なまけもの

備忘録

Batファイル内にPowerShellのスクリプトを記述する

概要

通常、BatファイルからPowerShellスクリプトを実行するには、別途ps1ファイルが必要となる。ちょっとしたスクリプトだとわざわざ別ファイルを用意するのは煩わしい。
Batファイル内部にPoweShellのスクリプトを記述し、実行する方法を記述する。

目次

記述内容

以下のように記述することで、BatファイルからPoweShellを起動できる。なお、実行されるスクリプトは"# PowerShellスクリプト"以降の行となっている。

@powershell -NoProfile -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((Get-Content \"%~f0\"|?{$_.readcount -gt 2})-join\"`n\"); &$s" %*
exit

# PowerShellのスクリプト

Write-Host "Hello, World!!"

解説

@powershell (省略)
PowerShellの実行コマンド。

-NoProfile
プロファイルを読み込まない。

-ExecutionPolicy
実行ポリシーをUnrestrictedに設定する。

"$s=(省略)&$s"
PowerShellで実行させるコマンド。

$s
変数。[scriptblock]::createで作成したスクリプトを格納している。

[scriptblock]::create((省略));
(省略)部分の文字列からPowerShellスクリプトを生成する。

Get-Content \"%~f0\"
\"%~f0\の内容を読み込む。

\"%~f0\
実行中のバッチファイル自身のパス。

|
パイプライン。

-gt 2
2より大きい。ここでは2行目以降となる。

-join
前述の文字配列を後述の文字で連結する。ここでは、バッチファイルの各行を改行コードで連結している。

$s
変数$2を実行する。

%*
バッチファイル実行時に与えられた引数。ここでは、引数全てをPowerShellに渡している。

exit
バッチ処理は終了。

# PowerShellのスクリプト
これ以降がPowerShellスクリプトになっている。


以上。