Изменение каталога в цикле for в пакетном скрипте - PullRequest
0 голосов
/ 26 августа 2018

Я хочу написать один пакетный скрипт, который будет копировать «am_test.txt» из подкаталога в новый путь, но я сталкиваюсь с трудностями при изменении пути внутри цикла for. В моем пакетном скрипте следующая строка не работает "cd! Temp! \ Testdata". Может кто-нибудь подскажет мне причину:

@echo off
setlocal enabledelayedexpansion
goto:main
goto:eof

:main
setlocal
for /d %%x in (*) DO (
   set temp=%%~fx
   echo !temp!
   cd !temp!\testdata
   copy am_test*.txt E:\Work_folder
)
endlocal

Ответы [ 2 ]

0 голосов
/ 27 августа 2018
@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 могут быть недопустимыми, поскольку система использует полный путь к текущему каталогу, объединенному с повторяющимся именем папки.

0 голосов
/ 26 августа 2018

Вот один из способов сделать то, для чего ваш код, по-видимому, предназначен.

В виде пакетного файла:

@For /D %%A In (*) Do @If Exist "%%A\testdata\am_test*.txt" Copy "%%A\testdata\am_test*.txt" "E:\Work_folder">Nul

В командной строке:

For /D %A In (*) Do @If Exist "%A\testdata\am_test*.txt" Copy "%A\testdata\am_test*.txt" "E:\Work_folder">Nul

В любом случае E:\Work_folder должно существовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...