Спиране при намиране на низ

Здравейте общност на StackOverflow!

Имам ПАРТИДА въпрос, който ме измъчва от няколко дни: Опитвам се да направя сравнение (звучи просто), но го правя по следния начин: имам две папки: SESSIONS и TARGETS. Всяка от тези папки има обикновени текстови файлове, които са именувани на сървър: Server1.txt, Server2.txt, Server3.txt и т.н. И двете директории имат файлове с абсолютно еднакви имена. Имената на файловете са важни само защото след като ги прочета, ще знам къде да разпределя информацията, която се съдържа в този файл. Пример:

СЕСИИ-->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)
        )
    )
)

)

Горното ще отпечата всички сесии, които са свързани, и всички сесии, които не са свързани. По същество това ще изведе МНОГО излишна и безполезна информация. Бих искал да направи следното:
Всеки път, когато намери низ от първия файл във втория файл, спира точно там и преминава към следващия низ в първия файл. Ако не намери низа от първия файл във втория файл. Echo "String not found" или нещо подобно.

Опитах се да бъда възможно най-описателен. Уведомете ме, ако имате допълнителни въпроси.

Благодаря ви предварително!


person gmilic    schedule 09.08.2013    source източник
comment
Бихте ли могли да поставите вътрешния цикъл в подпрограма (някъде другаде в партидния файл, означена напр. inner_loop: ) и след това да използвате командата за повикване, за да преминете към нея? След това можете да използвате командата exit, за да излезете от подчинения и да се върнете към основния цикъл.   -  person lessthanideal    schedule 09.08.2013


Отговори (2)


Това може да се направи с вградените асоциативни масиви на пакетния език:

@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