В сценариях оболочки, если мне нужно выполнить команду из каталога, я могу использовать подоболочку, чтобы вернуться в исходный контекст:
(cd temporary/new/directory ; command)
# now I am still in original directory
Это можно сделать в пакетных файлах Windows (или cmd-файлах)
То же самое в пакетных файлах оставляет меня в новом каталоге.
Я могу сделать:
pushd temporary\new\directory && command && popd
Но попд зависит от успеха command
.
Есть идеи?
Ответы:
Если вы делаете:
Вы останетесь (как вы заявляете) в папке \ windows. Пытаться:
и ты должен вернуться туда, откуда начал.
источник
cd
/pushd
иногда происходит сбой (например, если каталог не существует).pushd \windows && (foobar & popd)
может быть более надежнымПо умолчанию пакетные файлы Windows запускаются в контексте родительской оболочки (что необычно для пользователей Unix, где требуется явное
source
, но было единственной возможностью в MS-DOS). Это означает, что изменения каталога и переменные среды также влияют на оригинальную интерактивную оболочку.Поместите его
setlocal
в начало скрипта, чтобы он работал в своем собственном контексте - тогда вы можете безопасно использовать егоcd
внутри скрипта.источник
(
)
только группируют команды вместе, но все же запускают их в родительском контексте.(setlocal & cd foo & bar)
не будет работать; вместоpushd foo && (bar & popd)
этого будет необходимо.Как упоминалось ранее, это
pushd \windows && (foobar & popd)
будет работать лучше, чемpushd \windows & foobar & popd
потому, что последний может потерпеть неудачу, если такой директории нет.Кроме того, используя
setlocal
иendlocal
позволяет вам иметь несколько локальных сред, например, вы можете иметь:setlocal
cd dir
command
endlocal
Теперь вы вернетесь в исходный каталог.
источник
Вы можете использовать,
cd -
чтобы вернуться к предыдущему рабочему каталогу. И используйте;
вместо&&
, тогда последующие команды не будут зависеть от успеха предыдущих команд.источник
Я приветствую предложение Гравити поставить
setlocal
в начале вашего пакетного скрипта, но я бы добавил тот факт, что вы можете иметь несколько вложенных блоковsetlocal
/endlocal
, так что более уместным ответом на вопрос может бытьИ, конечно же , если вы хотите команду , которая будет выполняться , только если
cd
дляdir2
успешным, говорят .cd
dir2
&&
command
Обратите внимание, что блок
setlocal
/endlocal
создает локальную среду, поэтому любые переменные, которые вы устанавливаете или изменяете в таком блоке, возвращаются к своему предыдущему значению послеendlocal
.источник
Вы можете сохранить текущий каталог в переменную. Измените и измените обратно в зависимости от возвращаемого значения команды. Кстати,% CD% возвращает ваш текущий DIR.
источник