簡単な質問があります。
Windows バッチ (.bat) スクリプトから単一の WshShell コマンドを実行する最良の方法は何ですか?
(VBコードで新しいファイルを作成していないことを願っています)
簡単な質問があります。
Windows バッチ (.bat) スクリプトから単一の WshShell コマンドを実行する最良の方法は何ですか?
(VBコードで新しいファイルを作成していないことを願っています)
VBScript または Jscript を介して WshShell にアクセスできます。どちらもバッチ ファイルに埋め込むことができますが、JScript の方がはるかに簡潔です。
ほとんどの人は、一時的な VBS ファイルを作成してバッチ内で VBScript を実行します。ただし、一時ファイルがなくても実行できます。一時ファイルを使用せずにバッチ ファイル内に VBScript を埋め込んで実行することは可能ですか? を参照してください。各種オプションに。
バッチ内に JScript を埋め込むのは非常に簡単です。https://stackoverflow.com/a/5656250/1012053を参照してください。私はそのテクニックの非常にわずかなバリエーションを使用します。
@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment
:: ******* Begin batch code *********
@echo off
:: Your batch logic goes here
:: At any point you can execute the following to access your JScript
cscript //E:JScript //nologo "%~f0" yourJscriptParametersGoHere
:: Be sure to terminate your script so that
:: it does not fall through into the JScript code
exit /b
********* Begin JScript code **********/
var WshShell=WScript.CreateObject("WScript.Shell")
/* do whatever with your WshShell object */
説明:
テクニックの要は一行目。JScript とバッチの両方で有効な構文を持つ行である必要があります。
Batch は最初の行を、常に false と評価される単純な IF コマンドと見なすため、存在しない @end コマンドを実行することはなく、害はありません。次の行は、exit /b に到達するまではすべて通常のバッチ コードです。この時点でバッチ処理が終了し、残りの行は無視されます。
JScript は、最初の行を空の条件付きコンパイル ブロックとして認識し、その後に複数行のコメントの先頭が続きます。次のバッチ コードはすべてコメントの一部であるため、JScript は無視します。コメントは で終わり*/
、その後に通常の JScript コードが続きます。
失敗する可能性がある唯一のことは、バッチ コードが*/
その中に含まれている必要がある場合です。これは、JScript コメントが途中で終了するためです。しかし、バッチ解析後に消える何かを*
との間に入れることで解決できます。/
コードが引用符で囲まれていない場合は、次のようにスラッシュを単純にエスケープできます*^/
。コードが引用符で囲まれている場合は、未定義の変数を展開できます: *%=%/
. 名前付きの変数=
は、定義されていないことが保証されています。
これは、バッチと JScript のハイブリッド スクリプトを作成するために使用する方法です。
@if (@CodeSection == @Batch) @then
:: The first line above is...
:: in Batch: a valid IF command that does nothing.
:: in JScript: a conditional compilation IF statement that is false,
:: so this section is omitted until next "at-sign end".
@echo off
rem EXPR.BAT: Evaluate a JScript (arithmetic) expression
rem Antonio Perez Ayala
rem Define an auxiliary variable to call JScript
set JSCall=Cscript //nologo //E:JScript "%~F0"
rem Do Batch business here, for example:
%JSCall% %1
goto :EOF
End of Batch section
@end
// JScript section
WScript.Echo(eval(WScript.Arguments.Unnamed.Item(0)));
例えば:
EXPR 1/3
EDIT :よりシンプルで短い方法が必要な場合は、次の方法を使用してください。
@set @a=0 /*
@cscript //nologo //E:JScript "%~F0" "%~1"
@goto :EOF */
WScript.Echo(eval(WScript.Arguments(0)));
繰り返しますが、1 つ目@set @a=0 /*
は JScript とバッチの両方で有効なステートメント/コマンドであり、JScript コメント (/*) の開始を挿入するためにのみ使用されるため、バッチ セクションは JScript によって無視されます。コメントは、最後の の後に閉じられます (*/) goto :EOF
。
わずかな変更を行うように促してくれた上記に感謝します。
@if (false)==nul ======= CMD code =======
@echo off
::code before Cscript
cscript //nologo //e:jscript "%~f0" %*
echo it returns: %errorlevel%
::code after Cscript
exit /b
=================================
Freedom Land ^o^
======= J/VB Script code ======
@end
// Start Cscript
WScript.Echo("wsh says: Hello, Universe!");
WScript.Quit(123.456)