(Making pewne domysły, gdzie dane są brakujące z pytaniem)
cmd, kiedy skrypt wsadowy modyfikuje środowisko, domyślnym zachowaniem jest modyfikowanie środowiska procesu CMD, który je wykonuje.
Teraz, jeśli masz skrypt wsadowy, który wywołuje inny skrypt wsadowy, istnieją 3 sposoby, aby to zrobić.
uruchomić plik wsadowy bezpośrednio:
REM call q.bat
q.bat
REM this line never runs
Zwykle nie chcesz tego, ponieważ nie wróci do skryptu wywołującego wsadowym. To jest bardziej podobne do goto
niż gosub
. Proces CMD przełącza się z jednego skryptu do drugiego.
wykonać z call
:
REM call q.bat
CALL q.bat
REM changes that q.bat affects will appear here.
To jest najczęstszym sposobem dla jednego pliku wsadowego wywołać inny. Gdy zakończy się q.bat
, sterowanie powróci do dzwoniącego. Ponieważ jest to ten sam proces CMD, zmiany w środowisku nadal będą występować.
Uwaga: Jeśli q.bat
używa instrukcji EXIT
, może to spowodować zakończenie procesu CMD, bez zwracania kontroli do skryptu wywołującego.
Uwaga 2: Jeśli q.bat
używa EXIT /B
, proces CMD nie zostanie zakończony. Jest to przydatne do ustawienia ERRORLEVEL
.
Execute w nowym procesie CMD.
REM call q.bat
CMD /C q.bat
REM environment changes in q.bat don't affect me
Ponieważ bieg q.bat ins nowego procesu CMD, to wpływa na środowisko tego procesu, a nie CMD, że rozmówca jest uruchomiony w
Uwaga : Jeśli q.bat
użyje EXIT
, to nie zakończy procesu wywołującego.
Komenda SETLOCAL
CMD stworzy nowe środowisko dla bieżącego skryptu. Zmiany w tym środowisku nie będą miały wpływu na rozmówcę. Ogólnie rzecz biorąc, SETLOCAL
jest dobrą praktyką, aby uniknąć nieszczelnych zmian środowiska przez przypadek.
Aby korzystać SETLOCAL
i nadal naciskać zmian środowiskowych do skryptu wywołującego, przerwij skrypt:
ENDLOCAL && SET X=%X% && SET Y=%Y%
to będzie naciskać wartości X i Y dla środowiska macierzystego.
Jeśli natomiast chcesz uruchomić inny proces (nie skrypcie cmd) i ma to wpływ środowiska bieżącego skryptu, niż mieć narzędzie generuje plik wsadowy, który sprawia, że żądane zmiany, a następnie wykonać ten plik wsadowy.
REM q.exe will write %TEMP%\runme.cmd, which looks like:
REM set X=Y
q.exe
call "%TEMP%\runme.cmd"
Proszę dokładnie określić, z której powłoki korzystasz. CMD to moje najlepsze przypuszczenie, ale może masz na myśli PowerShell lub port Windows CSH. –