Отобразить все.txt файлы в именованных подкаталогах верхнего уровня базового каталога

У меня есть базовая папка, C:\Users\user\Desktop\BatchTesting\FTP, который имеет несколько папок внутри. Мне нужно получить доступ, скажем, к 5 папкам внутри папки FTP и повторить имена файлов внутри них.

Я написал следующий фрагмент кода, но, к сожалению, он не отображает список файлов:

@echo off
set codeList=Test1,Test2,Test3,Test4,Test5
set source=C:\Users\user\Desktop\BatchTesting\FTP\

setlocal ENABLEDELAYEDEXPANSION

for %%g in (%codeList%) do (

    for /R %source%%%g %%f in (*.txt) do (
        echo %%f
    )
)
endlocal

2 ответа

При отключенном echo ваш скрипт выдает следующий вывод (после изменения источника в соответствии с моей структурой тестового каталога):

>set codeList=Test1,Test2,Test3,Test4,Test5

>set source=d:\Tmp\Test

>setlocal ENABLEDELAYEDEXPANSION

>for %g in (Test1 Test2 Test3 Test4 Test5) do (for /R d:\Tmp\Test%g %f in (*.txt) do (echo %f ) )

>(for /R d:\Tmp\Test%g %f in (*.txt) do (echo %f ) )

>(for /R d:\Tmp\Test%g %f in (*.txt) do (echo %f ) )

>(for /R d:\Tmp\Test%g %f in (*.txt) do (echo %f ) )

>(for /R d:\Tmp\Test%g %f in (*.txt) do (echo %f ) )

>(for /R d:\Tmp\Test%g %f in (*.txt) do (echo %f ) )

>endlocal

Не очень поучительно, и нет простого способа вставить диагностику. Перестановка вашего кода для облегчения диагностики:

@setlocal ENABLEEXTENSIONS
@set prompt=$G
@set _codeList=Test1,Test2,Test3,Test4,Test5
@set _source=d:\Tmp\Test\

@for %%g in (%_codeList%) do @call :Recurse %_source%%%g
@exit /b 0

:Recurse
@for /R %1 %%f in (*.txt) do @call :List %%f
@REM @for /f %%f in ('dir /B /S %1\*.txt') do @call :List %%f
@exit /b 0

:List
@echo %%1 == %1
@exit /b 0

И это сработало, когда _source указал на правильный тестовый каталог, который был заполнен какими-то фактическими файлами. Это пример того, как ваша должная осмотрительность при публикации SO-вопроса часто избавляет вас от необходимости публиковать его.

Вы должны избегать использования многострочных для тел цикла. Проблем, которые вы можете создать для себя, слишком много, чтобы перечислять здесь. Всегда вызывая подпрограмму для выполнения работы, значительно облегчает отладку. С использованием @<cmd> Форма, а не вкл / выкл тупого эха, также облегчает выборочную трассировку через ваш скрипт и позволяет увидеть, как заменяются переменные замены. Подпрограмма Recurse показывает два разных способа перебора файлов, представляющих интерес.

Я также принял привычку ставить префикс локальных переменных с подчеркиванием. Таким образом, когда сценарий аварийно завершает работу и оставляет мусор в моей среде, я могу просматривать переменные сценария в одиночку, с помощью простого set _ и я могу вычистить их for /f "tokens=1 delims==" %f in ('set _') do set %f=,

Этот простой командный файл может быть использован:

@echo off
pushd "%USERPROFILE%\Desktop\BatchTesting\FTP"
dir "Test1\*.txt" "Test2\*.txt" "Test3\*.txt" "Test4\*.txt" "Test5\*.txt" /A-D /B /S
popd

Или команда DIR выполняется из окна командной строки с помощью:

dir "%USERPROFILE%\Desktop\BatchTesting\FTP\Test1\*.txt" "%USERPROFILE%\Desktop\BatchTesting\FTP\Test2\*.txt" "%USERPROFILE%\Desktop\BatchTesting\FTP\Test3\*.txt" "%USERPROFILE%\Desktop\BatchTesting\FTP\Test4\*.txt" "%USERPROFILE%\Desktop\BatchTesting\FTP\Test5\*.txt" /A-D /B /S

Команда DIR выводит

  • для всех файлов (включая скрытые файлы) из-за /A-D (атрибут НЕ каталог)
  • соответствие шаблону *.txt
  • имя файла + расширение из-за /B (голый формат)
  • в пяти указанных каталогах и во всех их подкаталогах и с полным путем из-за /S (поиск также в подкаталогах, что приводит к печати полного пути к файлу).

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • dir /?
  • echo /?
  • popd /?
  • pushd /?
Другие вопросы по тегам