pushd не работает в командном файле с отложенным расширением - PullRequest
1 голос
/ 21 мая 2019

Я прочитал много вопросов и ответов о pushd здесь и на других сайтах, подавляющее большинство из которых относится к проблемам с путями UNC. Однако у меня есть другая проблема, о которой я не видел ни единого намека.

Используя Windows 10 x64 Enterprise (версия 1809), я выполняю следующий командный файл из окна консоли:

@echo off
setLocal EnableDelayedExpansion
set DestDir=c:\windows
pushd %DestDir%

Моя проблема в том, что pushd, кажется, выполняется неправильно или не выполняется вообще. Это означает, что я не в c:\windows, когда был запущен командный файл, но все еще в каталоге, в котором я находился до его запуска.

Я попробовал несколько вещей в отчаянной попытке понять проблему (зная, что эти тесты не имели смысла):

  • поставить c:\windows в кавычках (set DestDir="c:\windows")
  • поставить %DestDir% в кавычках (pushd "%DestDir%")
  • используется ! вместо %, поскольку включено отложенное расширение, т. Е. pushd "!DestDir!"
  • запустил консольные окна. Я запустил командный файл изнутри от имени администратора.

Однако , когда я не включаю отложенное расширение , pushd работает как положено. Другими словами, после запуска следующего пакетного файла

@echo off
set DestDir=c:\windows
pushd %DestDir%

Меня действительно отправили в c: \ windows независимо от каталога, в котором я находился до запуска командного файла.

Полагаю, в данный момент я довольно глуп, но я не могу обернуться вокруг этого ради моей жизни. Так может кто-нибудь объяснить, почему pushd терпит неудачу, если активировано отложенное расширение?

1 Ответ

1 голос
/ 22 мая 2019

Причина вашей проблемы уже обсуждалась в комментариях, но решения пока не было.
Вы можете решить проблему с помощью явного endlocal:

REM @echo off
setLocal EnableDelayedExpansion
set DestDir=c:\windows
endlocal & pushd %DestDir%

Последняя строкаанализируется за один раз, поэтому %DestDir% заменяется на его значение (до endlocal) перед выполнением всей строки (запустите с echo on для просмотра).

...