!!!複数スクリプトの混在ファイル 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 {{code Text,4 @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 {{code Text,4 @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 を実行するバッチファイル !!!バッチファイル + Oracle SQL*Plus !!自身の SQL を SQL*Plus で実行するバッチファイル {{code Text,4 REM ^ /* 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') DT FROM DUAL; }} バッチファイルで、1行目と2行目はコメント(''^+改行''で改行がエスケープされて、2行目も1行目となり、REM でコメントとなる)。 以降で、SQL*Plus を起動し、「EXIT /B」でバッチファイルを終了する。 Oracle SQL*Plus では、1行目の '''REM''' もコメントとして扱われ、'''/*''' 〜 '''*/''' までもコメントとなり、7行目以降の SQL が実行される。 !!!バッチファイル + SQL Server sqlcmd ユーティリティ !!自身の SQL を sqlcmd で実行するバッチファイル {{code Text,4 :setvar dummy ^ /* @sqlcmd -S server\instance_name -U user -P pass -i "%~f0" @EXIT /B %ERRORLEVEL% */ -- SQL文 SELECT GETDATE() DT }} バッチファイルで、1行目と2行目はラベル(''^+改行''で改行がエスケープされて、2行目も1行目となり、:setvar のラベルとなる)。 以降で、sqlcmd を起動し、「EXIT /B」でバッチファイルを終了する。 SQL Server sqlcmd ユーティリティでは、1行目の ''':setvar''' でスクリプト変数の設定が行われ、'''/*''' 〜 '''*/''' までもコメントとなり、7行目以降の SQL が実行される。