Переменные ведут себя неправильно в командной строке Windows 10 - PullRequest
0 голосов
/ 31 января 2019

У меня есть вопрос о переменных в Windows cmd.Задача: выполнить все каталоги в той же папке, что и основной сценарий, найти файлы с определенным именем, ввести эти каталоги, запустить эти файлы, вернуться в исходную папку.

Основной сценарий:

SET origin=%~dp0
Echo "%origin%"
cd "%origin%"

for /R .\ %%a IN (*file_to_run_name.cmd) do (
    echo "%%a"
    echo "%%~da%%~pa"
    cd "%%~da%%~pa"
    %%a )

Echo "%origin%"
cd "%origin%"

Этот скрипт делает то, что мне нужно, кроме одного: он не меняет рабочий каталог на исходный.Если быть более точным, последний фрагмент:

Echo "%origin%"
cd "%origin%"

даже не называется.

Как это исправить?Спасибо.

1 Ответ

0 голосов
/ 01 февраля 2019

Не переменные ведут себя плохо.Вы пытаетесь запустить другие пакетные сценарии (.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%"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...