1

你好 StackOverflow 社区!

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

SESSIONS-->Server1.txt
Word_one
Word_two
Word_三
word_seven

TARGETS-->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)
        )
    )
)

)

以上将打印出所有已连接的会话和所有未连接的会话。本质上,这将输出大量冗余和无用的信息。我希望它执行以下操作:
每次从第二个文件中的第一个文件中找到一个字符串时,就停在那里,然后移动到第一个文件中的下一个字符串。如果在第二个文件中没有从第一个文件中找到字符串。回显“找不到字符串”或类似的内容。

我试图尽可能地进行描述。如果您有任何其他问题,请告诉我。

先感谢您!

4

2 回答 2

3

这可以通过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_项目不能有=标志、前导或尾随空格。

于 2013-08-09T17:37:25.760 回答
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依次设置为每个会话的文本文件名。

%%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)
)

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

于 2013-08-09T17:11:44.220 回答