批处理文件脚本新手。需要您的帮助,从下面的文本文件 (file.txt) 中提取(单引号)'' 中的所有值,并在另一个文本文件中找到该值,如果不存在,则会抛出错误。
file.txt
Wed 11/01/2023 - 19:59:23.33
BIP1138I: Applying overrides using runtime mqsiapplybaroverrides...
BIP1140I: Overriding property FTP_To_Trg#FtpServer with 'ftp.test.com' in 'App_Common_APP/META/broker.xml' ...
BIP1140I: Overriding property FTP_To_Trg#FileOut with 'ftp.test.com' in 'App_Common_APP/META/broker.xml' ...
BIP1140I: Overriding property Email#UDP_SysNm with 'SIT' in 'App_Common_APP/META/broker.xml' ...
我已经更新了文件路径并尝试了它不起作用,运行脚本后我没有看到任何事情发生,提供文件路径导致了问题?
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /f "delims=" %%e IN (C:\Users\k2\file.txt) DO FOR %%y IN (%%e) DO (
SET "word=%%y"
IF "!word:~0,1!!word:~-1!"=="''" (
FIND "!word:~1,-2!" C:\Users\k2\result.txt>nul
IF ERRORLEVEL 1 (>>C:\Users\k2 ECHO %%y) ELSE (>>C:\Users\k2 ECHO %%y)
)
)
尝试使用文件名,但我没有看到任何情况发生,我还为文件路径提供了双引号(“”),这是问题吗?
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /f "delims=" %%e IN ("C:\Users\k2\file.txt") DO FOR %%y IN (%%e) DO (
ECHO %%y
SET "word=%%y"
IF "!word:~0,1!!word:~-1!"=="''" (
ECHO processing %%y
FIND "!word:~1,-2!" "C:\Users\k2\result.txt">nul
IF ERRORLEVEL 1 (>>"C:\Users\k2\Failure.txt" ECHO %%y)
ELSE (>>"C:\Users\k2\Success.txt" ECHO %%y)
)
)
您应该能够适应这一点:
@ECHO Off&SETLOCAL ENABLEDELAYEDEXPANSION
FOR /f "delims=" %%e IN (q77438851.txt) DO FOR %%y IN (%%e) DO SET "word=%%y"&IF "!word:~0,1!!word:~-1!"=="''" FIND "!word:~1,-2!" q77438851_2.txt>nul&IF ERRORLEVEL 1 (>>u:\miss ECHO %%y) ELSE (>>u:\hit ECHO %%y)
(这只是证明它可以用两行完成)-重新格式化为更好的布局
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /f "delims=" %%e IN (q77438851.txt) DO FOR %%y IN (%%e) DO (
SET "word=%%y"
IF "!word:~0,1!!word:~-1!"=="''" (
FIND "!word:~1,-2!" q77438851_2.txt>nul
IF ERRORLEVEL 1 (>>u:\miss ECHO %%y) ELSE (>>u:\hit ECHO %%y)
)
)
q77438851.txt
是我的测试文件,q77438851_2.txt
是在其中查找找到的字符串的另一个文件。
读取从
q77438851.txt
到%%e
的每一行,然后依次将%%y
分配给每个空格分隔的字符串(注意:也使用,;
作为分隔符)
将找到的“单词”分配给
word
,因为您无法对 metavariable
(%%e %%y
) 进行子串化
查看
word
的第一个字符和最后一个字符是否都是'
。如果是这样的话...
使用
word
定位第二个文件中从第二个到倒数第二个字符的 find
的子字符串,将 find
的输出定向到位仓,并将 errorlevel
设置为 0
(如果找到)并且如果没有找到,则非0
。
将找到的引用单词(在
%%y
中)写入 hit
或 miss
文件(我的 U:
是内存驱动器)
显然,在运行之前需要清除所使用的目标文件 - 或者可以在脚本中删除它们。
子字符串处理 - 请参阅 docco 提示中的
set /?
或 SO 上的数千个示例。
编辑回应评论 - 仅第一个引用的字符串
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /f "usebackqdelims=" %%e IN ("q77438851.txt") DO SET "first=y"&FOR %%y IN (%%e) DO (
SET "word=%%y"
if defined first IF "!word:~0,1!!word:~-1!"=="''" (
set "first="
FIND "!word:~1,-2!" q77438851_2.txt>nul
IF ERRORLEVEL 1 (>>u:\miss ECHO %%y) ELSE (>>u:\hit ECHO %%y)
)
)
将
first
设置为每行读取的值。
如果定义了
first
并且它是引用的单词,则将 first
设置为 nothing(这意味着它变为未定义 - 但在读取下一行时将重新定义)