あなたの現在のトリックに対して新しい要件がない単純な答えは、start
コマンドを使用してスクリプトをバッチファイルの実行から切り離すことです。
唯一の違いは
wscript
を実行するために
start
を使用している
>usermessage.vbs ECHO WScript.Echo^("Generating report - this may take a moment." ^)
start WSCRIPT.EXE usermessage.vbs
echo This text is a proxy for the hard work of writing the report
:次のようになります
。これは、現在のディレクトリに一時ファイルが置かれていて、最終的に手動で解除する必要があるという欠点を抱えています。
両方の問題が扱いやすい:
ここ
@echo off
setlocal
set msg="%TMP%\tempmsg.vbs"
ECHO WScript.Echo^("Generating report - this may take a moment." ^) >%msg%
start WSCRIPT.EXE /I /T:15 %msg%
echo This text is a proxy for the hard work of writing the report
ping -n 5 127.0.0.1 >NULL
del %msg% >NUL 2>&1
、私は%TMP%
フォルダに一時的なスクリプトを上に移動し、我々はそれで終わったときにそれを削除することを忘れないでください。 echo
とping
コマンドを使用して、長時間のプロセス実行を実証する時間を無駄にしました。そして、/I
と/T
のオプションをwscript
に使用して、スクリプトが「インタラクティブに」実行されていることを確認し、スクリプトを実行できる最大時間を設定しました。
@echo off
とsetlocal
は、コマンドプロンプトで実行するときれいに見え、プロンプトの環境に `%msg%という名前を残さないようにします。
編集:ヨハネス・レセルのコメントでのsetlocal
の批判は間違っています。これがコマンドプロンプトで呼び出された場合は、setlocal
がなくても、msgとそのプロンプトから起動された他のバッチファイルとプログラムにmsgが表示されます。バグファイル内のローカル変数を分離するために、setlocal
を使用することをお勧めします。
これは簡単に証明することができる。
C:> type seta.bat
@set A=SomeValue
C:> set A
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\Ross\Application Data
C:> seta.bat
C:> set A
A=SomeValue
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\Ross\Application Data
C:>
申し訳ありませんが、あなたはcmd.exeのは、* nixの殻のようにあまりにも多くあると仮定されています。コマンドプロンプトで呼び出される各バッチファイルは、その非常にcmd.exeのコピーによって解釈され、実際には他のコマンドの環境を変更することができます。それがsetlocalが追加された理由です。ただし、エクスプローラからバッチファイルが呼び出された場合は正しいです。これはDOS 1.0とCOMMAND.COMの間で真であり、少なくともXPでは真実です。 – RBerteig