2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PowerShellスクリプト(.ps1)をダブルクリックで実行する手段

Posted at

PowerShellスクリプトファイル(.ps1)をexe感覚で使ってほしい時の壁

反復作業を自動化するにあたり、PowerShellスクリプトファイル(.ps1)は簡単に作れて有力な手段かと思います。
しかし他の人にツールとして提供すると、ps1はダブルクリックで実行できず困ることになります。

Windowsコマンドスクリプト経由で実行

Windowsコマンドスクリプト(.cmd)の実行ファイルから.ps1を実行

.cmdと同階層の、コード内で指定した.ps1を実行する場合

ps1をダブルクリックで実行.cmd
@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のディレクトリもコード内で指定する場合

ps1をダブルクリックで実行.cmd
@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を、ユーザーが番号で選んで実行する場合

ps1をダブルクリックで実行.cmd
@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 仕様に引きずられることがある。
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?