Не переменные ведут себя плохо.Вы пытаетесь запустить другие пакетные сценарии (.cmd
), и контроль выполнения не возвращается к основному сценарию, если вы не используете call
.Кроме того, используйте cd
/D
, а не просто /D
, поскольку, если целевой каталог находится на другом диске, необходимо использовать /D
.И строка %%~da%%~pa
может быть упрощена до %%~dpa
.Наконец, позвольте мне порекомендовать использовать синтаксис set
в кавычках для защиты специальных символов.
Итак, вот фиксированный код:
set "origin=%~dp0"
echo "%origin%"
cd /D "%origin%"
for /R .\ %%a in (*file_to_run_name.cmd) do (
echo "%%a"
echo "%%~dpa"
cd /D "%%~dpa"
call "%%a"
)
echo "%origin%"
cd /D "%origin%"
Однако, это еще можно улучшить: есть команды pushd
(для сохранения текущего каталога, а затем для перехода к указанному каталогу) и popd
(для восстановления предыдущегосохраненный каталог), поэтому вам не нужно сохранять исходный путь к переменной.
Вот как их применять:
echo "%~dp0"
cd /D "%~dp0"
for /R .\ %%a in (*file_to_run_name.cmd) do (
echo "%%a"
echo "%%~dpa"
pushd "%%~dpa"
call "%%a"
popd
)
echo "%CD%"