Как вернуться в исходный каталог после вызова каталога изменений в пакете DOS? - PullRequest
27 голосов
/ 09 августа 2011

Я хочу создать пакетный файл batch.bat, который принимает 2 обязательных аргумента:

  • %1 представляет путь относительно текущего каталога.
  • %2 представляет имя файла.

Предположим, что текущим каталогом является father\me\.

Пользователь может использовать этот пакет следующим образом:

  • batch child/grandchild log
  • batch ../brother log

Описание задания batch.bat выглядит следующим образом.

  1. Перемещение в каталог %1,
  2. Повторяет все файлы *.tex в каталоге %1.
  3. Сохраните результат в каталоге перед перемещением.

Ниже приведен неполный код:

rem batch.bat takes 2 arguments.
cd %1
dir /b *.tex > <original directory>\%2.txt

Как вернуться в исходный каталог после вызова каталога изменений в пакете DOS?

Ответы [ 4 ]

46 голосов
/ 09 августа 2011

Если вы хотите ВОЗВРАТИТЬ в исходный каталог, сделайте первое изменение с помощью PUSHD и вернитесь с помощью POPD. То есть перемещение в каталог% 1 должно быть достигнуто с помощью

PUSHD %1

вместо CD% 1, и возврат достигается с помощью

POPD

вместо CD где?

Если вы хотите получить доступ к исходному каталогу после его изменения, сохраните его в переменной следующим образом:

SET ORIGINAL=%CD%

и использовать% ORIGINAL% позже, например:

dir /b *.tex > %original%\%2.txt
12 голосов
/ 15 декабря 2011

Определенно 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. Но это поведение, которое вы должны знать.

Ответ на комментарий Джонни

Это может сбить с толку, когда 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
4 голосов
/ 19 сентября 2015
set ORIGINAL_DIR=%CD% 

REM #YOUR BATCH LOGIC HERE

chdir /d %ORIGINAL_DIR% 
1 голос
/ 09 августа 2011

Вы всегда можете установить% cd% для переменной перед изменением каталогов:

set current="%cd%"
cd "C:\Some\Other\Folder"
cd "%current%"

В большинстве случаев создание переменной с каталогом используется в пакетных сценариях. Если скрипт имеет небольшую длину, я определю свои переменные в начале сценария, который включает важные пути, файлы, подпрограммы и / или длинные команды.

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

...