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“未找到字符串”或类似的东西。
我试图尽可能地描述性。如果您有任何其他问题,请与我们联系。
提前谢谢!
答案 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}}
只是将报告移出一个级别。