INDEX
複数スクリプトの混在ファイル
1ファイルに複数のスクリプトを記載する。
バッチファイル + JScript
自身の JScript を実行するバッチファイル
@if (0)==(0) @ECHO OFF
REM バッチファイルで起動された場合、自身を JScript で実行する
cscript //Nologo //E:JScript "%~f0" %*
EXIT /B %ERRORLEVEL%
@end
// 以降、実行される JScript
WScript.Echo("JScript");
WScript.Quit(0);
バッチファイルでは、「if (0)==(0)」が評価され、「ECHO OFF」が実行される。cscript コマンドで、「%~f0」でバッチファイルの完全修飾パスが、「%*」で残りのコマンド引数が渡され、JScript が実行される。「EXIT /B %ERRORLEVEL%」でスクリプトの戻り値を終了コードに返して、バッチを終了する。
JScript では、条件付きコンパイルで「@if (0)」が評価され実行されず、「@end」までスキップされる。
1
1 |
@if (0)==(0) @ECHO OFF
REM バッチファイルの処理
ECHO cmd
GOTO :EOF
@end
// JScript の処理
WScript.Echo("JScript");
|
バッチファイルで実行された場合、1行目は、「if (0)==(0)」が評価され、echo off が実行される。2行目以降から、通常のバッチファイルの処理がされ、5行目の「GOTO :EOF」でファイルの最後にジャンプする(つまり、バッチファイルが終了する)。
if の条件を (0)==(1) などにすれば、if 以降のコマンドは実行されない。
JScript で実行された場合、1行目は、条件付きコンパイルで「@if (0)」が評価され、6行目の「@end」までは実行されない。そして、7行目以降が JScript で実行される。
2
1 |
@set @temp=0/*
@ECHO OFF
REM バッチファイルの処理
ECHO cmd
GOTO :EOF
*/
// JScript の処理
WScript.Echo("JScript");
|
バッチファイルで実行された場合、1行目は、「set @temp=0/*」が評価され、 @temp と言う環境変数に 0/* がセットされる。2行目以降から、通常のバッチファイルの処理がされ、5行目の「GOTO :EOF」でファイルの最後にジャンプする(つまり、バッチファイルが終了する)。
JScript で実行された場合、1行目は、条件付きコンパイルで「@set @temp=0」が評価され、@temp に 0 がセットされる。そのあとの /* 〜 */ まではコメントとなり、8行目以降が JScript で実行される。
バッチファイル + VBScript
自身の VBScript を実行するバッチファイル
' 2> NUL & @CLS & @cscript //Nologo //E:VBScript "%~f0" %* & @EXIT /B %ERRORLEVEL% ' 以降、実行される VBScript WScript.Echo "VBScript" WScript.Quit 1
バッチファイルで、「' 2> NUL」が実行されるが、「'」と言ったコマンドはなくエラーとなる。「2> NUL」でエラーメッセージを消し、「CLS」でコンソール画面のメッセージをクリアする。「%~f0」でバッチファイルの完全修飾パスが、「%*」で残りのコマンド引数が渡され、VBScript が実行して、「EXIT /B」でバッチファイルを終了する。VBScript では、1行目はコメント扱いで、以降が実行される。
バッチファイル + PowerShell
自身の PowerShell を実行するバッチファイル
PowerShell は、ファイル名の拡張子が .ps1 である必要があるため、バッチファイル内に PowerShell スクリプトを記載して、そのバッチファイルを指定して実行させることはできない。
そのため、バッチファイルとしても共存させたスクリプトファイルの内容を実行させる場合は、「-Command -」で、標準入力からスクリプトの内容を渡して実行させる。または、「Get-Content」でスクリプトの内容を読み、「Invoke-Expression」でその内容を実行させる。と言った方法が必要になる。
- バッチファイルにPowerShellスクリプトを埋め込む - Programming Field
- (極道)バッチファイルだと思った? ざんねん!PowerShell でした!
@powershell "iex((gc '%~f0'|select -skip 2)-join[char]10)" @EXIT /B %ERRORLEVEL% Write-Host 'PowerShell' exit 0
引数がいらなければ、これだけかな…。
先頭2行がバッチファイルで、powershell で、バッチファイル自身を読み込み、先頭2行をスキップして、残りを eval して、3行目以降のスクリプトを実行。「EXIT /B %ERRORLEVEL%」でスクリプトの戻り値を終了コードに返して、バッチを終了する。
引数を渡したい場合は、 -Command パラメータ以降が、すべてコマンドとして扱われてしまうため、もう一工夫必要になる。
PowerShell.exe -ExecutionPolicy RemoteSigned -File test.ps1
Write-Host 'PowerShell' exit 0
コマンドプロンプトか PowerShell どちらのコンソールか表示する
(dir 2>&1 *`|echo CMD);&<# rem #>echo PowerShell
コマンドプロンプトなら CMD が、PowerShell なら PowerShell が表示される。ただそれだけ。
- ssh - How to determine if I'm in powershell or cmd? - Stack Overflow
バッチファイル + Oracle SQL*Plus
自身の SQL を SQL*Plus で実行するバッチファイル
1 |
REM ^ /* @ECHO OFF SET NLS_LANG=JAPANESE_JAPAN.JA16SJIS SQLPLUS user/pass@hostname:1521/service_name @"%~f0" EXIT /B %ERRORLEVEL% */ -- SQL文 SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') NowTime FROM DUAL; |
バッチファイルで、1行目と2行目はコメント(^+改行で改行がエスケープされて、2行目も1行目となり、REM でコメントとなる)。以降で、SQL*Plus を起動し、「EXIT /B」でバッチファイルを終了する。
Oracle SQL*Plus では、1行目の REM もコメントとして扱われ、/* 〜 */ までもコメントとなり、7行目以降の SQL が実行される。
バッチファイル + SQL Server sqlcmd ユーティリティ
自身の SQL を sqlcmd で実行するバッチファイル
1 |
:setvar dummy ^ /* @ECHO OFF sqlcmd -S server\instance_name -U user -P pass -i "%~f0" EXIT /B %ERRORLEVEL% */ -- SQL文 SELECT CONVERT(VARCHAR,GETDATE(),121) NowTime |
バッチファイルで、1行目と2行目はラベル(^+改行で改行がエスケープされて、2行目も1行目となり、:setvar のラベルとなる)。以降で、sqlcmd を起動し、「EXIT /B」でバッチファイルを終了する。
SQL Server sqlcmd ユーティリティでは、1行目の :setvar でスクリプト変数の設定が行われ、/* 〜 */ までもコメントとなり、7行目以降の SQL が実行される。
最終更新時間:2025年08月13日 18時51分52秒 指摘や意見などあればSandBoxのBBSへ。