(製作一些猜測其中的細節都從你的問題遺漏)
在CMD,當批處理腳本修改環境時,默認行爲是它修改正在執行它的CMD進程的環境。
現在,如果您有一個調用另一批處理腳本的批處理腳本,有三種方法可以實現。
直接執行的批處理文件:
REM call q.bat
q.bat
REM this line never runs
通常你不希望這樣,因爲它不會返回到調用批處理腳本。這更像goto
而不是gosub
。 CMD過程只是從一個腳本切換到另一個腳本。
執行與call
:
REM call q.bat
CALL q.bat
REM changes that q.bat affects will appear here.
這是一個批處理文件最常用的方法調用另一個。當q.bat
退出時,控件將返回給調用者。由於這是相同的CMD過程,所以對環境的改變仍然存在。
注意:如果q.bat
使用EXIT
語句,則可能會導致CMD進程終止,而不會將控制權返回給調用腳本。
注2:如果q.bat
使用EXIT /B
,則CMD過程不會退出。這對於設置ERRORLEVEL
很有用。
執行一個新的CMD過程:
REM call q.bat
CMD /C q.bat
REM environment changes in q.bat don't affect me
由於q.bat運行INS新的CMD的過程,它會影響這一進程的環境,而不是CMD呼叫者在運行
注:如果q.bat
使用EXIT
,則它不會終止呼叫者的進程。
的SETLOCAL
CMD命令將爲當前腳本的新環境。該環境中的更改不會影響調用者。一般來說,SETLOCAL
是一個很好的做法,可以避免意外泄漏環境的變化。
要使用SETLOCAL
仍然推動環境的變化,以調用腳本,結束腳本:
ENDLOCAL && SET X=%X% && SET Y=%Y%
這將X和Y的值推到父環境。
如果在另一方面,你想運行其他程序(而不是CMD腳本),並讓它影響當前的腳本環境,不是讓工具生成一個批處理文件,讓你想更改,然後執行該批處理文件。
REM q.exe will write %TEMP%\runme.cmd, which looks like:
REM set X=Y
q.exe
call "%TEMP%\runme.cmd"
請具體說明您正在使用哪個外殼。 CMD是我最好的猜測,但也許你的意思是PowerShell或CSH的Windows端口。 – 2009-07-28 17:43:46