@echo off
setlocal enabledelayedexpansion
rem pushd popd
for /d %%x in (*) do (echo ---& echo fx: "%%~fx") & (pushd "%%x") && (echo cd: "!cd!") & popd
rem cd
for /d %%x in (*) do (echo ---& echo fx: "%%~fx") & (cd "%%x") & echo cd: "!cd!"
exit /b
Чтобы понять, что является причиной проблемы, создайте сценарий, который делает подобное, хотя и изолирует проблему.Приведенный выше код демонстрирует похожую проблему.
Созданные папки на диске Z:
с именами a
, b
и c
.
Вывод сценария
---
fx: "Z:\a"
cd: "Z:\a"
---
fx: "Z:\b"
cd: "Z:\b"
---
fx: "Z:\c"
cd: "Z:\c"
---
fx: "Z:\a"
cd: "Z:\a"
---
fx: "Z:\a\b"
The system cannot find the path specified.
cd: "Z:\a"
---
fx: "Z:\a\c"
The system cannot find the path specified.
cd: "Z:\a"
pushd
и popd
успешно выполнены и выглядят правильно.Текущий каталог восстанавливается до следующей итерации.
cd
успешно выполняется с a
, но не с b
и c
.Ошибка основана на итерации папок *
при изменении каталога в цикле, а не на его восстановлении.Поскольку возвращаемые папки являются относительными именами к исходному текущему каталогу, пути %%~fx
могут быть недопустимыми, поскольку система использует полный путь к текущему каталогу, объединенному с повторяющимся именем папки.