!!!複数スクリプトの混在ファイル 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 を実行するバッチファイル PowerShell は、ファイル名の拡張子が '''.ps1''' である必要があるため、バッチファイル内に PowerShell スクリプトを記載して、そのバッチファイルを指定して実行させることはできない。 そのため、バッチファイルとしても共存させたスクリプトファイルの内容を実行させる場合は、「-Command -」で、標準入力からスクリプトの内容を渡して実行させる。 または、「Get-Content」でスクリプトの内容を読み、「Invoke-Expression」でその内容を実行させる。 と言った方法が必要になる。 * バッチファイルにPowerShellスクリプトを埋め込む - Programming Field ** https://www.pg-fl.jp/program/tips/ps1bat.htm ** https://www.pg-fl.jp/program/tips/ps1bat2.htm 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 ** https://stackoverflow.com/questions/34471956/how-to-determine-if-im-in-powershell-or-cmd !!!バッチファイル + 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') NowTime 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 CONVERT(VARCHAR,GETDATE(),121) NowTime }} バッチファイルで、1行目と2行目はラベル(''^+改行''で改行がエスケープされて、2行目も1行目となり、:setvar のラベルとなる)。 以降で、sqlcmd を起動し、「EXIT /B」でバッチファイルを終了する。 SQL Server sqlcmd ユーティリティでは、1行目の ''':setvar''' でスクリプト変数の設定が行われ、'''/*''' 〜 '''*/''' までもコメントとなり、7行目以降の SQL が実行される。