4

簡単な質問があります。

Windows バッチ (.bat) スクリプトから単一の WshShell コマンドを実行する最良の方法は何ですか?

(VBコードで新しいファイルを作成していないことを願っています)

4

4 に答える 4

8

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 コメントが途中で終了するためです。しかし、バッチ解析後に消える何かを*との間に入れることで解決できます。/コードが引用符で囲まれていない場合は、次のようにスラッシュを単純にエスケープできます*^/。コードが引用符で囲まれている場合は、未定義の変数を展開できます: *%=%/. 名前付きの変数=は、定義されていないことが保証されています。

于 2013-03-02T01:38:27.973 に答える
7

これは、バッチと 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

于 2013-03-02T15:24:11.270 に答える
2

わずかな変更を行うように促してくれた上記に感謝します。

@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)
于 2014-07-12T17:29:47.917 に答える