Тимчасово змінити каталог для однієї командної файлової команди


19

У сценаріях оболонок, якщо мені потрібно запустити команду з каталогу, я можу зробити нам підзаголовок, щоб переконатися, що я повернувся до початкового контексту:

(cd temporary/new/directory ; command)
# now I am still in original directory

Чи можна це зробити в batch-файлах Windows (або cmd-файлах)

Це те ж саме в batch-файлах залишає мене в новому каталозі.

Я можу зробити:

pushd temporary\new\directory && command && popd

Але popd залежить від успіху command.

Будь-які ідеї?


Як ви викликаєте свій "batch-файл" або "cmd-файл"? Якщо ви помістите команду cd в скрипт оболонки і виконаєте цей скрипт (не джерело його), поточна робоча директорія оболонки виклику не зміниться.
garyjohn

Щоб зрозуміти, це стосується пакетних файлів Windows.
Грег

Це сценарій, який виконує купу команд у різних частинах дерева каталогів. Деякі команди працюють лише в поточному каталозі. Повернення до вихідного каталогу допомагає спростити дані, які керують сценарієм. Ви пропонуєте зробити окремий пакетний файл для кожного каталогу, в який мені потрібно телефонувати?
Грег

Як я пам’ятаю, ви згадували сценарії оболонки і не згадували Windows у своєму первісному запитанні, тому я неправильно припустив, що ви використовуєте систему, схожу на Unix. Тепер я розумію.
garyjohn

Так, вибачте, я розумію, що мені було не зрозуміло (хоча я думаю, що "batch-file" був натяком :-p)
Грег,

Відповіді:


21

Якщо ти зробиш:

pushd \windows && foobar && popd

ви залишитесь (як заявляєте) у папці \ windows. Спробуйте:

pushd \windows & foobar & popd

і вам слід знайти себе там, де ви почали.


1
Ах, тому одиночна амперсанда є еквівалентом напівколонки в ш. Це ідеально. (та довідка: ss64.com/nt/syntax-conditional.html )
Грег,

6
Добре пам’ятати, що cd/ pushdіноді виходить з ладу (наприклад, якщо каталог не існує). pushd \windows && (foobar & popd)може бути більш надійним
користувач1686

16

За замовчуванням пакетні файли Windows запускаються в контексті батьківської оболонки (що незвично для користувачів Unix, де потрібна явна source, але була єдиною можливістю в MS-DOS). Це означає, що зміни каталогів та змінні середовища впливають і на оригінальну інтерактивну оболонку.

Покладіть setlocalу верхній частині свого сценарію, щоб він запускався у власному контексті - тоді ви можете сміливо використовувати cdвсередині сценарію.


Дякую, це звучить як те, що мені потрібно - я перевірю це, коли отримаю доступ до машини Windows. Чи вплине це на підкоманди з використанням дужок?
Грег

1
@Greg: Здається, що ( )тільки групують команди разом, але все ж запускають їх у батьківському контексті. (setlocal & cd foo & bar)не буде працювати; натомість pushd foo && (bar & popd)знадобиться.
користувач1686

4

Як згадувалося раніше, grawity працював pushd \windows && (foobar & popd)би краще, ніж pushd \windows & foobar & popdтому, що останній може вийти з ладу, якщо такого каталогу не буде.

Крім того, використання setlocalта endlocalдозволяє мати декілька локальних середовищ, так, наприклад, ви можете:

setlocal

cd dir

command

endlocal

Тепер ви повернетесь до свого початкового каталогу.


3

Ви можете використовувати cd -для повернення до попереднього робочого каталогу. І використовувати ;замість цього &&, тоді наступні команди не залежатимуть від успішності попередніх команд.

$ pwd
/etc
$ cd /var ; pwd ; cd -
/var
$ pwd
/etc

Я оновив питання, щоб уточнити, що я запитую про сценарій пакетного / оболонки Windows. Я знаю, як це зробити під ш-подібною оболонкою :)
Грег

Як зазначив BillP3rd, еквівалент ";" у batch-файлах є "&".
Грег

Ах, вибачте. Ваше використання прямих косої риски змусило мене думати, що це UNIX.
bahamat

1

Я схвалюю пропозицію grawity, щоб поставити setlocalна початку вашого пакетного сценарію, але я додам той факт, що у вас може бути кілька, вкладених, setlocal/ endlocalблоків, тому більш відповідна відповідь на питання може бути

@echo off
setlocal
cddir1
  ...
setlocal
cddir2
command
endlocal
:: Now I am back indir1
  ...

І, звичайно, якщо ви хочете, щоб команда виконувалась лише в тому випадку, якщо команда cdto dir2успішна, скажіть .cddir2&&command

Зауважте, що setlocal/ endlocalблок створює локалізоване середовище, тому будь-які змінні, які ви встановили або змінили в такому блоці, повернуться до попереднього значення після endlocal.


0

Ви можете зберегти поточний каталог у змінну. Змінити та змінити назад, залежно від значення повернення команди. BTW,% CD% повертає ваш поточний DIR.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.