Остановка при обнаружении строки

Привет, сообщество StackOverflow!

У меня есть ПАКЕТНЫЙ вопрос, который мучает меня уже несколько дней: я пытаюсь провести сравнение укусов (звучит просто), но я делаю это следующим образом: у меня есть две папки: SESSIONS и TARGETS. В каждой из этих папок есть обычные текстовые файлы, названные в честь сервера: Server1.txt, Server2.txt, Server3.txt и т. д. В обеих папках есть файлы с одинаковыми именами. Имена файлов важны только потому, что, прочитав их, я буду знать, где разместить информацию, содержащуюся в этом файле. Пример:

SESSIONS-->Server1.txt
Word_one
Word_two
Word_three
word_seven

ЦЕЛИ-->Server1.txt
Word_one
Word_two
Word_seven

Это код, который я использую для обхода папок Sessions и Targets:

FOR %%a in (%ses_dir%*.txt) DO (
FOR /F "TOKENS=1 DELIMS= " %%c in (%%a) DO (
    FOR %%f in (%targ_dir%*.txt) DO (
        FOR /F "TOKENS=1 DELIMS= " %%i in (%%f) DO (
            SET tmp_nam=%%~na

            IF %%c EQU %%i ( ECHO This is Connected)
            IF %%c NEQ %%i ( ECHO This is not Connected)
        )
    )
)

)

Приведенное выше распечатает все сеансы, которые подключены, и все сеансы, которые не подключены. По сути, это выведет МНОГО избыточной и бесполезной информации. Я бы хотел, чтобы он делал следующее:
Каждый раз, когда он находит строку из первого файла во втором файле, тут же останавливался и переходил к следующей строке в первом файле. Если он не находит строку из первого файла во втором файле. Эхо "Строка не найдена" или что-то в этом роде.

Я постарался быть настолько описательным, насколько мог. Дайте мне знать, если у вас возникнут дополнительные вопросы.

Заранее спасибо!


person gmilic    schedule 09.08.2013    source источник
comment
Не могли бы вы поместить внутренний цикл в подпрограмму (где-то еще в пакетном файле, помеченном, например, inner_loop:), а затем использовать команду вызова, чтобы перейти к нему? Затем вы можете использовать команду выхода, чтобы выйти из подчиненного и вернуться к основному циклу.   -  person lessthanideal    schedule 09.08.2013


Ответы (2)


Это можно сделать с помощью встроенных ассоциативных массивов языка Batch:

@echo off &SETLOCAL
SET "sessionDir=SESSIONS"
SET "targetDir=TARGETS"

FOR %%a IN ("%sessionDir%\*.txt") DO (
    IF NOT EXIST "%targetDir%\%%~nxa" (
        ECHO "%%~nxa" NOT found IN "%targetDir%"
    ) ELSE (
        FOR /f "usebackqdelims=" %%b IN ("%%~fa") DO SET "$%%b=1"
        FOR /f "usebackqdelims=" %%b IN ("%targetDir%\%%~nxa") DO SET "#%%b=1"
        FOR /f "delims=$=" %%x IN ('set "$"') DO IF NOT DEFINED #%%x ECHO "%%x" missing IN "%targetDir%\%%~nxa"
        FOR /f "delims=#=" %%x IN ('set "#"') DO IF NOT DEFINED $%%x ECHO "%%x" missing IN "%%~fa"
    )
)

Обратите внимание: элементы Word_ не могут иметь знаки =, пробелы в начале или в конце.

person Endoro    schedule 09.08.2013

FOR %%a in (%ses_dir%*.txt) DO (
 FOR /F "TOKENS=1 DELIMS= " %%c in (%%a) DO (

  SET "tmp_nam="

  FOR /F "TOKENS=1 DELIMS= " %%i in (%targ_dir%%%~nxa) DO IF NOT DEFINED tmp_nam (
   IF %%c EQU %%i SET tmp_nam=%%~na
  )
  if defined tmp_nam (echo %%c connected) else (echo %%c not connected)
 )
)

Это должно, я считаю, достичь вашей цели.

%%a устанавливается на имя текстового файла каждого сеанса по очереди.

%%c устанавливается для каждого слова из текстового файла в %%a, а tmp_nam очищается

%%i устанавливается для каждого слова из идентичного имени файла в целевом каталоге.

Если совпадение найдено, tmp_nam устанавливается на что-то (неважно какое, только не пустое). Остальные сравнения с остальными словами в таргетах пропускаются, потому что tmp_nam теперь определено.

В зависимости от того, найдено совпадение или нет, выводится слово, которое совпало + "(не)подключено". С тем же успехом может быть %%a или и %%c, и %%a, если это вас устраивает.

Теперь - если вы имеете в виду, что хотите сказать %%a (not) connected, если ANY ONE слово в session совпадает в targets, независимо от того,

FOR %%a in (%ses_dir%*.txt) DO (

 SET "tmp_nam="

 FOR /F "TOKENS=1 DELIMS= " %%c in (%%a) DO (
  FOR /F "TOKENS=1 DELIMS= " %%i in (%targ_dir%%%~nxa) DO IF NOT DEFINED tmp_nam (
   IF %%c EQU %%i SET tmp_nam=%%~na
  )
 )
 if defined tmp_nam (echo %%a connected) else (echo %%a not connected)
)

который просто перемещает отчетность на один уровень.

person Magoo    schedule 09.08.2013