Найти файл в цикле for в командной строке - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь найти файлы для запуска команд в сценарии командной строки (пакетной).Пока все хорошо:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /R %%I IN ("*.Marker.txt") DO (
   SET MARKER=%%I
   SET LOG= ???

   ECHO MARKER IS !MARKER! AND LOG IS !LOG!
)

По сути, я хочу перебрать пару файлов и выполнить для них команду (на данный момент просто echo).У меня проблема в том, что файл журнала может находиться в любом каталоге, из которого существует файл *.Marker.txt.Я не могу просто сказать 100.Marker.log, потому что это просто имя файла, а не полный путь.Некоторые примеры:

C: \ Temp \ Samples \ 3A5 \ 100.Marker.txt C: \ Temp \ Samples \ 3A5 \ 9 \ 1 \ 100.Marker.log C: \ Temp \ Samples \ 39B \122.Marker.txt C: \ Temp \ Samples \ 39B \ 2 \ 5 \ 122.Marker.log

Итак, не совсем уверен, что здесь делать.

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018

Если все ваши файлы имеют одинаковый формат (text.Marker.ext), вы можете использовать:

@echo off
setlocal EnableDelayedExpansion

for /R %%A IN ("*.Marker.*") DO (
    set MARKER=%%A
    for /F "tokens=1 delims=." %%B IN ("%%A") do (
        set LOG=%%B
    )
   echo MARKER IS !MARKER! AND LOG IS !LOG!
)

Обратите внимание, что я обычно не предлагаю заглавные буквы в пакетном файле.

  • Мы создаем цикл, который проходит по всем подпапкам (for /R), пытаясь найти файлы, содержащие .Marker. (IN ("*.Marker.*")).
  • Мы устанавливаем вывод в переменную (MARKER).
  • Теперь мы перебираем найденное имя файла с настройками delims до ..Это означает, что: token1.token2.token3.. не будет анализироваться как токен.
  • Установить результат в переменную.
0 голосов
/ 30 декабря 2018
@echo off
setlocal enabledelayedexpansion

REM following lines to create test environment
md C:\Temp\Samples\3A5\9\1 2>nul
md C:\Temp\Samples\39B\2\5 2>nul
break>C:\Temp\Samples\3A5\100.Marker.txt 
break>C:\Temp\Samples\3A5\9\1\100.Marker.log 
break>C:\Temp\Samples\39B\122.Marker.txt 
break>C:\Temp\Samples\39B\2\5\122.Marker.log
REM end creating test environment

for /R "C:\Temp\Samples\" %%a in ("*.marker.txt") do (
  for /f %%b in ('dir /s/b "%%~dpa\%%~na.log"') do (
    ECHO Textfile: %%a    Logfile: %%b
  )
)

for /R рекурсивно ищет все подходящие файлы (*.marker.txt в C:\Temp\Samples\ и подпапках.
for /f ищет подходящие файлы журналов в папке, где находится marker.txt.

Выходные данные:

Textfile: C:\Temp\Samples\39B\122.Marker.txt    Logfile: C:\temp\Samples\39B\2\5\122.Marker.log
Textfile: C:\Temp\Samples\3A5\100.Marker.txt    Logfile: C:\temp\Samples\3A5\9\1\100.Marker.log

Примечание. Предполагается, что для каждого .txt имеется только одно соответствие .log, и оно находится внутри дерева ниже .txt

0 голосов
/ 29 декабря 2018

Вы можете использовать PUSHD / POPD для загрузки / извлечения рабочего каталога во время сценария и внутреннего цикла.

FOR /R %%I IN ("*.Marker.txt") DO (
   SET DIRECTORY=%%~DPI
   SET FILENAME=%%~NI
   SET MARKER=%%I

   PUSHD !DIRECTORY!
   FOR /R %%J IN ("!FILENAME!.log") DO (
     SET LOGFILE=%%J

     ECHO !MARKER!
     ECHO !LOGFILE!
   )
   POPD
)

Не уверен, как найти одно значение, FORтехнически будет работать на всех совпадениях, но если вы скажете, что у вас должно быть только одно значение, то внутренний цикл будет выполняться только один раз для каждого файла маркераМожет быть, есть более эффективный способ поиска одного файла без использования FOR?

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