- 環境変数を設定するバッチ ファイルがあります: setenv.bat
- 変数を設定するために、VB スクリプトで setenv.bat を使用したい
要約すると、私の VBS は setenv.bat を起動し、setenv.bat で指定された環境変数を使用します。
出来ますか?
要約すると、私の VBS は setenv.bat を起動し、setenv.bat で指定された環境変数を使用します。
出来ますか?
アポリアは正しいです。VBSからバッチファイルを実行すると、の別のコピーcmd
が開始されます。これは、バッチファイルが独自の環境で実行されることを意味します。その環境は、バッチファイル(より正確には、cmd
そのバッチを実行しているプロセス)が終了するとすぐに失われます。したがって、そのバッチファイルによって行われた変数の割り当ては、そのバッチファイルに対して「ローカル」になります。
しかし、それはあなたが望むことをまったく達成できないという意味ではありません。cmd
異なるセッション間でそれらを保持する値を割り当てる方法が必要です。そして、それを行うコマンドがあり、それはですSETX
。これにより、「グローバル」環境変数を作成/変更できます。この変数は、さまざまなcmd
セッション間だけでなく、Windowsセッション間でも持続します。
コマンドの構文は、の構文と似ていますが、変数名とその値の間に文字がSET
ないだけです。=
SETX variable value
値にスペース(または特殊文字)が含まれている場合は、二重引用符で囲みます(値が割り当てられると削除されることに注意してください)。SETX
組み込みのヘルプを読んで学ぶことができるオプションがありSETX /?
、コマンドプロンプトで実行するだけですが、これで十分な場合があります。
についてのもう1つのことはSETX
、実際には状況に関連していないように見えますが、将来のために覚えておく価値があるかもしれませんが、奇妙なことに、によって行われた割り当ては、割り当てが行われたセッションにSETX
反映されません。cmd
(実際、その時点でアクティブなcmdセッションには反映されません。)つまり、状況に応じて、を使用して割り当てた同じバッチファイルで新しい値を読み取ることはできませんSETX
。ただし、バッチファイルを実行した後(および完了を待った後)は、VBSでそれらを確実に読み取ることができます。
したがって、これがどのように機能するかを示すためのテストセットアップは次のとおりです。
setenv.bat
:
SETX testvar1 123
test.vbs
:
Set objShell = WScript.CreateObject("WScript.Shell")
Set objUserEnv = objShell.Environment("User")
' show the value before running the batch script
WScript.Echo "1. testvar1=" & objUserEnv("testvar1")
' set the environment with the batch file
objShell.Run "setenv.bat", 1, true
' show the value again to see the effect
WScript.Echo "2. testvar1=" & objUserEnv("testvar1")
アップデート
一部の変数がの一部として未定義(またはのように削除SET variable=
)されてsetenv.bat
いる場合、これは次の方法を使用して行う方法ですSETX
。
SETX variable ""
いいえ、これは機能しません。VBスクリプトを実行するsetevn.bat
と、.batファイルは独自のプロセスで実行されるため、設定した環境変数にVBスクリプトからアクセスすることはできません。
あなたはそれを他の方法で行うことができますか?.batファイルからVBスクリプトを呼び出しますか?
はい、%time% や %date% などの疑似環境変数を除いて、任意の環境変数にアクセスできます。
対話するバッチ ファイルと vbs ファイルを作成しました。
k.bat
@echo off
:: Setting ERRORLEVEL to 0
DIR *.* > NUL
:: Display current ErrorLevel
echo ErrorLevel=%errorlevel%
:: Creating a variable for the VBS file to see
set VBS=Can you see me?
echo.
echo Entering VBS
echo =============================
cscript /nologo k.vbs
echo =============================
echo Exited VBS
echo.
echo ErrorLevel=%errorlevel%
echo Test=%Test%
echo Test2=%Test2%
ECHO VBS=%VBS%
goto :eof
k.vbs
Set wshShell = CreateObject( "WScript.Shell" )
' Store the EV %PATH% in var1
var1 = "PATH = " & wshShell.ExpandEnvironmentStrings( "%PATH%" )
' Print var1
wscript.echo var1
wscript.echo
' Getting Ready to Create / Set an EV (In Vista and Above you cannot
' set "SYSTEM" variables.
Set wshUserEnv = wshShell.Environment( "USER" )
Set wshSystemEnv = wshShell.Environment( "SYSTEM" )
' Another method of retrieving an EV that takes advantage of wshShell.Environment
' Get value of %Test%
WScript.Echo "Test=" & wshUserEnv( "Test" )
' Set EV %Test%
wshUserEnv( "Test" ) = "VBS Can set Environmental Variables"
' Print out the value of %Test%
WScript.Echo "Test=" & wshUserEnv( "Test" )
'Both methods are not created equilly
WScript.Echo "1 VBS=" & wshUserEnv( "VBS" )
wscript.echo "2 VBS = " & wshShell.ExpandEnvironmentStrings( "%VBS%" )
' Overwrite %VBS%
wshUserEnv( "VBS" ) = ""
WScript.Echo "3 VBS=" & wshUserEnv( "VBS" )
WScript.Echo "4 VBS=" & wshSystemEnv( "VBS" )
wscript.echo "5 VBS = " & wshShell.ExpandEnvironmentStrings( "%VBS%" )
' In Vista and up, VBS cannot delete an EV it did not create
wshUserEnv.Remove( "VBS" )
' Delete Variable %Test%
wscript.echo "Deleting Test"
wshUserEnv.Remove( "Test" )
' Show variable %Test% again, using first method
wscript.echo "TEST = " & wshShell.ExpandEnvironmentStrings( "%Test%" )
WScript.Echo "Test=" & wshUserEnv( "Test" )
' Create one last varible for the batch file to check
wshUserEnv( "Test2" ) = "Yes you can!"
WScript.Echo "Test2=" & wshUserEnv( "Test2" )
' Set the ERRORLEVEL to 99
wscript.quit 99
私の出力 (%PATH% の多くを切り取りましたが、プロパティは表示されます。)
Output:
VBS=
ErrorLevel=0
VBS= 2:39:46.02
Entering VBS
=============================
PATH = c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE;c
Visual Studio 9.0\Common7\Tools;c:\Windows\Microsoft.NET\Framework\v3.
tudio 9.0\VC\VCPackages;C:\Program Files\\Microsoft SDKs\Windows\v6.0A\
Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live
Shell\v1.0\;c:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;
d++\;C:\Program Files (x86)\Android\android-sdk\tools;C:\Program Files
(x86)\Lua\5.1\clibs;C:\Program Files\Java\jre7\bin\msvcr100.dll;C:\Prog
indows NT\Accessories\;C:\Program Files (x86)\Windows Live\Shared;C:\Pr
w64;C:\Program Files (x86)\Common Files\Ulead Systems\MPEG;D:\Program F
Test=
Test=VBS Can set Environmental Variables
1 VBS=
2 VBS = 2:39:46.02
3 VBS=
4 VBS=
5 VBS = 2:39:46.02
Deleting Test
TEST = %Test%
Test=
Test2=Yes you can!
=============================
Exited VBS
ErrorLevel=99
Test=
Test2=
VBS= 2:39:46.02
ご覧のとおり、バッチ ファイルは環境変数を使用して VBS スクリプトにデータを送信でき、スクリプトはそれらの変数を読み取って処理できます。ただし、 を除いて%ERRORLEVEL%
、VBS スクリプトは、バッチ ファイルが表示および使用する変数を変更または追加することはできません。
これは、バッチ ファイルで使用される環境のコピーを使用して VBS スクリプトが起動されるためです。そのため、呼び出し元のバッチ ファイルに制御が戻ると、その環境は終了し、元の環境の変数は変更されません。(繰り返しますが、例外はあり%ERRORLEVEL%
ます。)