PowerShellをバッチファイルから実行する

PowerShell(パワーシェル)スクリプトをコマンドプロンプトやバッチファイルから実行する方法についてまとめました。
ここでは外部のPowerShellファイルを呼び出す方法とバッチファイルに直接コマンドを記述する方法についてご紹介します。

PowerShellファイルを呼び出す方法

この方法では、別途PowerShellファイルを用意して、それを呼び出すことでPowerShellスクリプトを実行します。

powershell -File test.ps1

相対パスでpsファイルを指定する場合は以下

powershell -File .\tmp\test.ps1

絶対パスでpsファイルを指定する場合は以下

powershell -File C:\tmp\test.ps1

PowerShellスクリプトに引数を渡す

powershell -File C:\tmp\test.ps1 10 "あいうえお" 123

コマンドを直接実行する方法

上記の「PowerShellファイルを呼び出す方法」ではバッチファイルとPowerShellファイル2つのファイルが必要で、少し使いにくいので1つのバッチファイルにまとめたいと思われる人は多いかと思います。
その場合、以下のように記述することで、外部ファイルを指定するのではなく、コマンドを直接実行することが可能です。

powershell -Command "Write-Host Hello World!;"

バッチファイルでPowerShellスクリプトに引数を渡したい場合は、事前に宣言した環境変数をコマンドの中に埋め込むことで同様の処理ができるのでおすすめです。

set Arg1=1234
set Arg2=あいうえお
powershell -Command "Write-Host %Arg1%;Write-Host %Arg2%;"

コマンドの中で「”」(ダブルクォーテーション)を使いたい場合、以下のようにエスケープ文字を使うことで使用可能です。

powershell -Command "$A = \"1行目\";$B = \"2行目\";$Message = $A + \"`n\" + $B";Write-Host $Message;"

上記は、変数Aと変数Bに文字列を設定する際に“1行目”ではなく\”1行目\”のように記述することで、powershellコマンドのCommandオプション内でも「”」(ダブルクォーテーション)が使えるようにしています。

powershellコマンドについて

Powershellコマンドの詳細は公式サイトを確認するか、ヘルプをご確認ください。
ヘルプは以下のコマンドを実行することで参照できます。

powershell -Help

ヘルプコマンドの出力

PowerShell[.exe] [-PSConsoleFile <ファイル> | -Version <バージョン>]
    [-NoLogo] [-NoExit] [-Sta] [-Mta] [-NoProfile] [-NonInteractive]
    [-InputFormat {Text | XML}] [-OutputFormat {Text | XML}]
    [-WindowStyle <スタイル>] [-EncodedCommand <Base64 エンコードのコマンド>]
    [-ConfigurationName <文字列>]
    [-File <ファイル パス> <引数>] [-ExecutionPolicy <実行ポリシー>]
    [-Command { - | <スクリプト ブロック> [-args <引数の配列>]
                  | <文字列> [<コマンド パラメーター>] } ]

PowerShell[.exe] -Help | -? | /?

-PSConsoleFile
    指定された Windows PowerShell コンソール ファイルを読み込みます。コンソー
    ル ファイルの作成には、Windows PowerShell の Export-Console を使用します。

-Version
    指定されたバージョンの Windows PowerShell を起動します。
    このパラメーターでバージョン番号 ("-version 2.0" など) を入力します。

-NoLogo
    スタートアップ時に著作権の見出しを非表示にします。

-NoExit
    スタートアップ コマンドを実行後、終了しません。

-Sta
    シングルスレッド アパートメントを使用して、シェルを起動します。
    既定ではシングルスレッド アパートメント (STA) です。

-Mta
    マルチスレッド アパートメントを使用して、シェルを起動します。

-NoProfile
    Windows PowerShell プロファイルを読み込みません。

-NonInteractive
    ユーザーに対話的なプロンプトを表示しません。

-InputFormat
    Windows PowerShell に送られたデータの形式を指定します。有効な値は、"Text"
    (テキスト文字列) または "XML" (シリアル化 CLIXML 形式) です。

-OutputFormat
    Windows PowerShell からの出力の形式を決定します。有効な値は、"Text" (テ
    キスト文字列) または "XML" (シリアル化 CLIXML 形式) です。

-WindowStyle
    ウィンドウ スタイルを Normal、Minimized、Maximized、または Hidden に設定します。

-EncodedCommand
    Base-64 エンコードの文字列のコマンドを受け付けます。複雑な引用符や中かっ
    こが必要なコマンドを Windows PowerShell に送るには、このパラメーターを使
    用します。

-ConfigurationName
    Windows PowerShell が実行される構成エンドポイントを指定します。
    ローカル コンピューターに登録された任意のエンドポイントを指定できます。
    たとえば、既定の Windows PowerShell リモート処理エンドポイントや、特定の
    ユーザー機能を持つカスタム エンドポイントなどを指定できます。

-File
    指定されたスクリプトをローカル スコープ ("ドット ソース") で実行して、
    スクリプトによって作成された関数と変数を現在のセッションで使用できるように
    します。スクリプト ファイルのパスとパラメーターを入力します。
    File はコマンド内で最後のパラメーターである必要があります。File パラメーター
   名の後に入力された文字は、スクリプト ファイルのパスとスクリプトのパラメー
    ターとして解釈されるためです。

-ExecutionPolicy
    現在のセッションの既定の実行ポリシーを設定し、
    $env:PSExecutionPolicyPreference 環境変数に保存します。
    このパラメーターでは、レジストリに設定されている Windows PowerShell 実行
    ポリシーは変更されません。

-Command
    PowerShell のコマンド プロンプトに入力された場合と同様に、指定されたコマ
    ンド (および任意のパラメーター) を実行します。NoExit が指定されていない場
    合は、そのまま終了します。Command の値には、"-"、文字列、またはスクリプト
    ブロックを指定できます。

    Command の値が "-" の場合、コマンド テキストは標準入力から読み込まれます。

    Command の値がスクリプト ブロックの場合は、スクリプト ブロックを中かっこ
    ({}) で囲む必要があります。スクリプト ブロックを指定できるのは、Windows
    PowerShell で PowerShell.exe を実行している場合だけです。スクリプト ブロ
    ックの結果は、ライブ オブジェクトではなく逆シリアル化 XML オブジェクトと
    して親シェルに返されます。

    Command の値が文字列の場合、Command はコマンド内で最後のパラメーターである
    必要があります。コマンドの後に入力された文字は、コマンド引数として解釈さ
    れるためです。

    Windows PowerShell コマンドを実行する文字列を記述するには、次の形式を使用します。
        "& {<コマンド>}"
    引用符によりこれが文字列であることを示し、呼び出し演算子 (&) によりコマ
    ンドが実行されます。

-Help, -?, /?
    このメッセージを表示します。Windows PowerShell で PowerShell.exe のコマン
    ドを入力する場合、コマンド パラメーターの前にスラッシュ (/) ではなくハイ
    フン (-) を入力してください。Cmd.exe では、ハイフンまたはスラッシュのいずれかを使用できます。

例
    PowerShell -PSConsoleFile SqlSnapIn.Psc1
    PowerShell -version 2.0 -NoLogo -InputFormat text -OutputFormat XML
    PowerShell -ConfigurationName AdminRoles
    PowerShell -Command {Get-EventLog -LogName security}
    PowerShell -Command "& {Get-EventLog -LogName security}"

    # -EncodedCommand パラメーターを使用する場合:
    $command = 'dir "c:\program files" '
    $bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
    $encodedCommand = [Convert]::ToBase64String($bytes)
    powershell.exe -encodedCommand $encodedCommand

コメント

  1. […] […]

  2. […] […]

タイトルとURLをコピーしました