PowerShellスクリプトファイル(.ps1)をexe感覚で使ってほしい時の壁
反復作業を自動化するにあたり、PowerShellスクリプトファイル(.ps1)は簡単に作れて有力な手段かと思います。
しかし他の人にツールとして提供すると、ps1はダブルクリックで実行できず困ることになります。
Windowsコマンドスクリプト経由で実行
Windowsコマンドスクリプト(.cmd)の実行ファイルから.ps1を実行
.cmdと同階層の、コード内で指定した.ps1を実行する場合
@echo off
REM --- UTF-8 に切り替え(日本語文字化け対策)---
chcp 65001 >nul
REM --- .cmd と同じディレクトリの .ps1 を指定 ---
set "ps1file=%~dp0実行するps1の名前.ps1"
REM --- PowerShell で ps1 を実行 ---
powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "%ps1file%"
REM --- 処理が終了してもコマンドプロンプトを閉じない(エラーが分かるように) ---
pause
.ps1のディレクトリもコード内で指定する場合
@echo off
REM --- UTF-8 に切り替え(日本語文字化け対策)---
chcp 65001 >nul
REM --- 実行したい .ps1 のパスを指定 ---
set "ps1file=C:\Users\Public\Documents\実行するps1の名前.ps1"
REM --- PowerShell で ps1 を実行 ---
powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "%ps1file%"
REM --- 処理が終了してもコマンドプロンプトを閉じない(エラーが分かるように) ---
pause
.cmdと同階層の.ps1を、ユーザーが番号で選んで実行する場合
@echo off
setlocal enabledelayedexpansion
REM --- UTF-8 に切り替え(日本語文字化け対策)---
chcp 65001 >nul
REM --- .cmd のあるディレクトリに移動 ---
cd /d "%~dp0"
REM --- 同階層の .ps1 を列挙して番号付きで表示 ---
set i=0
for %%f in ("%~dp0*.ps1") do (
set /a i+=1
set "ps1[!i!]=%%~f"
echo !i!: %%~nxf
)
REM --- ps1 が1つも無ければ終了 ---
if %i%==0 (
echo .ps1 ファイルが見つかりませんでした。
pause
exit /b 1
)
REM --- 列挙したps1を番号で指定。正しい入力があるまで繰り返し ---
:ask
set /p choice=実行する番号を入力してEnterキーを押してください (1-%i%):
REM === 入力チェック ===
REM ・空入力ならやり直し
if "%choice%"=="" goto ask
REM ・数値が1未満ならやり直し
if %choice% lss 1 goto ask
REM ・数値が最大数より大きければやり直し
if %choice% gtr %i% goto ask
REM --- 選ばれた ps1 を変数に格納 ---
set "ps1file=!ps1[%choice%]!"
REM --- PowerShell で実行 ---
powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "%ps1file%"
REM --- 処理が終了してもコマンドプロンプトを閉じない(エラーが分かるように) ---
pause
endlocal
パラメータの内容
powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "%ps1file%"
-NoLogo
PowerShell 起動時に表示される「ロゴ情報」(著作権やバージョン情報などのメッセージ)を非表示。
-NoProfile
PowerShell 起動時に読み込まれる ユーザープロファイルを無効に。
ユーザーごとの環境の違いを無くす。
-ExecutionPolicy
PowerShellのスクリプト実行ポリシーの許可レベルを一時的に上書き。
Restricted | スクリプトの実行をすべて禁止 |
---|---|
RemoteSigned | ダウンロードした.ps1は署名が無いと実行禁止 |
Bypass | 制限なく許可 |
他の方法とメリットデメリット
ショートカットファイルを作る
powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -File "C:\Users\Public\Documents\実行するps1の名前.ps1"
すぐ作れて簡単
エラーが出てもコマンドプロンプトが閉じてしまい分からない
ショートカットファイルはGoogle Driveなどで共有できない
.cmd内に.ps1の処理を書く
@echo off
powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -Command ^
"Write-Host 'Hello World'; Pause"
.cmdだけでまとめられる
特殊文字がコードと誤認識されやすく、エスケープ処理が大変
.ps1をダブルクリックしたときの既定のプログラムをPowerShellに変更
グローバルでPowerShellの実行ポリシーの許可レベルを下げておく必要がある
レクチャーの手順が多い
(補足)なぜ.batではなく.cmdなのか
.cmdの方が新しい分、.batよりもエラーで悩まされることが減る印象です。
以下ChatGPT
.cmd
- Windows NT 系列 (NT/2000/XP 以降) で導入された。
- NT 用に動作が整理されていて、エラーコード処理などが現行仕様に統一されている。
- 現在の Windows 環境では .cmd の方が推奨されることが多い。
.bat
- MS-DOS 時代からある拡張子。
- 古い互換性を維持している。
- 一部の「エラー処理」や「終了コード伝搬」の挙動が古い DOS 仕様に引きずられることがある。