Как вернуться в исходный каталог после вызова каталога изменений в пакете DOS?
Я хочу создать командный файл batch.bat
, который принимает 2 обязательных аргумента:
-
%1
представляет собой путь относительно текущего каталога.
-
%2
представляет собой filaname.
Предположим, что текущий каталог father\me\
.
Пользователь может использовать эту партию следующим образом:
-
batch child/grandchild log
-
batch ../brother log
Описание задания batch.bat
выглядит следующим образом.
- Переместится в каталог
%1
,
- Итерирует весь файл
*.tex
в каталоге %1
.
- Сохраните результат в каталоге перед перемещением.
Ниже приведен неполный код:
rem batch.bat takes 2 arguments.
cd %1
dir /b *.tex > <original directory>\%2.txt
Как вернуться в исходный каталог после вызова каталога изменений в пакете DOS?
Ответы
Ответ 1
Если вы хотите ВОЗВРАТИТЬ в исходный каталог, выполните первое изменение с помощью PUSHD
и вернитесь с помощью POPD
. То есть, перемещение в каталог% 1 должно быть достигнуто с помощью
PUSHD %1
вместо CD% 1, а возврат достигается с помощью
POPD
вместо CD, где?
Если вы хотите ДОСТУПИТЬ исходный каталог после его изменения, сохраните его в переменной таким образом:
SET ORIGINAL=%CD%
и используйте% ORIGINAL% позже, например:
dir /b *.tex > %original%\%2.txt
Ответ 2
Определенно PUSHD/POPD - это предпочтительный способ сделать это. Но есть функция (недокументированная?) SETLOCAL/ENDLOCAL, которая выполняет одно и то же (в дополнение ко всему, что делает SETLOCAL).
Если вы измените каталог после SETLOCAL, вы вернетесь в исходный каталог по ENDLOCAL.
cd OriginalLocation
setlocal
cd NewLocation
endlocal
rem we are back to OriginalLocation
Еще одна вещь с документированным SETLOCAL: любой SETLOCAL в подпрограмме с названием или пакетной меткой будет завершен с неявным ENDLOCAL после выхода из партии или подпрограммы. Неявный ENDLOCAL вернется в исходную папку так же, как явный ENDLOCAL.
cd OriginalLocation
call :ChangeLocation
rem - We are back to OriginalLocation because :ChangeLocation did CD after a SETLOCAL
rem - and there is an implicit ENDLOCAL upon return
exit /b
:ChangeLocation
setlocal
cd NewLocation
exit /b
Я бы не рекомендовал использовать SETLOCAL/ENDLOCAL вместо PUSHD/POPD. Но это поведение, о котором вы должны знать.
Ответ на комментарий johnny
Он может запутать, когда PUSHD/POPD и SETLOCAL/ENDLOCAL объединены. ENDLOCAL делает не удаление стека PUSHD, о чем свидетельствует следующее:
setlocal
cd test
@cd
pushd new
@cd
endlocal
@cd
popd
@cd
- ВЫВОД -
D:\test>setlocal
D:\test>cd test
D:\test\test
D:\test\test>pushd new
D:\test\test\new
D:\test\test\new>endlocal
D:\test
D:\test>popd
D:\test\test
Ответ 3
set ORIGINAL_DIR=%CD%
REM #YOUR BATCH LOGIC HERE
chdir /d %ORIGINAL_DIR%
Ответ 4
Вы всегда можете установить% cd% для переменной перед сменой каталогов:
set current="%cd%"
cd "C:\Some\Other\Folder"
cd "%current%"
В большинстве случаев создание переменной в каталоге используется в пакетных сценариях. Если script является полуразмерным, я буду определять свои переменные в начале script, который включает в себя важные пути, файлы, субтитры и/или длинные команды.
@ECHO OFF
REM Variables
::Programs
SET save_attachments=C:\Program Files\APED\Program\save_attachments.vbs
SET sendemail=C:\Program Files\APED\Program\sendkeys.vbs
SET tb=C:\Program Files\Mozilla Thunderbird\thunderbird.exe
SET fox=C:\Program Files\Foxit Software\Foxit Reader\Foxit Reader.exe
SET spool=C:\WINDOWS\system32\PRNJOBS.vbs
::Directories
SET new=C:\Program Files\APED\New
SET printing=C:\Program Files\APED\Printing
SET finish=C:\Program Files\APED\Finish
SET messages=C:\Program Files\APED\Script_Messages
SET nonpdf=C:\Program Files\APED\NonPDFfiles
SET errorfiles=C:\Program Files\APED\Error Files
::Important Files
SET printlog=C:\Program Files\APED\Script_Messages\PrintLOG.txt
SET printemail=C:\Program Files\APED\Script_Messages\EmailPrintLOG.txt
SET errorlog=C:\Program Files\APED\Script_Messages\ErrorLOG.txt
SET erroremail=C:\Program Files\APED\Script_Messages\EmailErrorLOG.txt
SET movefiles=C:\Program Files\APED\Script_Messages\MoveFiles.txt
Однако PUSHD и POPD - отличные решения, если они коротко и ясно.