Powershell埋め込みバッチファイル(自分用)


特徴

・2行目以降にPowershellスクリプトを書ける
・ダブルクリックで実行できる、オプションを渡すこともできる。
・最小化状態で起動する
・$env:SELFPATHでPowershellスクリプト(バッチファイル)本体のパスを取得できる
・外部powershellファイルを呼び出して実行できる

いろんなサイトを参考に組み合わせたものです、参考サイトは参考サイトにリンクを張っておきます。

スクリプト

下記のコードをコピーして1行目に貼り付け、バッチファイルとして保存します。

@if not "%~0"=="%~dp0.\%~nx0" (start /min cmd /c,"%~dp0.\%~nx0" %* & goto :eof)  else  (setlocal enableextensions enabledelayedexpansion & set "SELFPATH=%~dp0" & set "SELF=%~f0" & PowerShell.exe -ExecutionPolicy Bypass -Command "& (Invoke-Expression -Command ('{#' + ((Get-Content '!SELF:'=''!') -join \"`n\") + '}'))" %* & exit /b !errorlevel!)

メモ

コンソールウインドウを最小化から通常状態に戻す

エラーや入力待ちの入力を促す際に使えると思います。最小化するには7行目の61728を61472に変えます。

$title = $Host.UI.RawUI.WindowTitle;
$Host.UI.RawUI.WindowTitle += (new-object random).next();
$process = (ps | where {$_.MainWindowTitle -eq $Host.UI.RawUI.WindowTitle});
$Host.UI.RawUI.WindowTitle = $title;
$hwnd = $process.MainWindowHandle;
[void][Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms');
$message = [System.Windows.Forms.Message]::Create($hwnd, 274, 61728, 0);
$nativeWindow = new-object System.Windows.Forms.NativeWindow;
$nativeWindow.DefWndProc([ref]$message)

参考サイト:PowerShellの1行バッチでコンソールウィンドウを最小化/最大化/元に戻す。

引数を解釈する(簡易版)

$arghash = @{}
$arghash["_blank"] = @()
if($args.Count -gt 0){
    $argname = "_blank"
    foreach($argval in $args){
        if($argval.StartsWith("-")){
            $argname = $argval.substring(1, $argval.Length-1)
            if(!($arghash.ContainsKey($argname))){
                $arghash[$argname] = @()
            }
        }else{
            $arghash[$argname] += $argval
        }
    }
}

参考サイト

PowerShell - バッチファイル内に記述したスクリプトを実行する。
コマンドファイルを最小化した状態で実行します