找到字符串后停止

时间:2013-08-09 15:49:43

标签: batch-file scripting windows-server-2008

Hello StackOverflow社区!

我有一个BATCH问题,一直困扰着我几天: 我想做一个刺痛的比较(听起来很简单),但我这样做: 我有两个文件夹:SESSIONS和TARGETS。 这些文件夹中的每一个都有一个以服务器命名的普通文本文件:Server1.txt,Server2.txt,Server3.txt等。两个目录都有完全相同名称的文件。文件名很重要,因为在阅读它们之后,我将知道在哪里分配该文件中包含的信息。例如:

  

SESSIONS - > Server1.txt
  Word_one
  Word_two
  Word_three
  word_seven
  

     

TARGETS - > Server1.txt
  Word_one
  Word_two
  Word_seven

这是我用来遍历Sessions and 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“未找到字符串”或类似的东西。

我试图尽可能地描述性。如果您有任何其他问题,请与我们联系。

提前谢谢!

2 个答案:

答案 0 :(得分:3)

可以使用批处理语言的内置关联数组来完成:

@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_项不能包含=个标志,前导或尾随空格。

答案 1 :(得分:1)

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依次设置为每个会话的textfilename。

%%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) ) 字在{{1}}中匹配,则无论如何,

{{1}}

只是将报告移出一个级别。