Подтвердить что ты не робот

Как вернуться в исходный каталог после вызова каталога изменений в пакете 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?

4b9b3361

Ответ 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 - отличные решения, если они коротко и ясно.