我有一个包含内容的文字文件:
process.exe Pid:4513
G:\data\Windows
process.exe Pid:6754
G:\data\Linux
process.exe Pid:4328
G:\data\MacOS
我想要一个批处理脚本:
Searches for 1st occurrence of 'process.exe' and then searches for 1st occurrence of any one of the 'Windows/Linux/MacOS' word and let's assume Windows word found then send the following output to a text file 'Output.txt' :
process.exe Pid:4513 Windows
Then searches for 2nd occurrence of 'process.exe' and then searches again for 1st occurrence of any one of the 'Windows/Linux/MacOS' word and let's assume Linux word found then send the following output to the same text file 'Output.txt' :
process.exe Pid:6754 Linux
and so on..
最后,' Output.txt'文件应具有以下内容:
process.exe Pid:4513 Windows
process.exe Pid:6754 Linux
process.exe Pid:4328 MacOS
答案 0 :(得分:2)
虽然这个问题并不严格遵守规则,因为您没有尝试自己解决问题,这不是一个代码为我自由的代码网站;我相信有人在寻找类似问题的解决方案可能会得到答案:
@ECHO OFF
SETLOCAL
SET "keystring1="
(
FOR /f "delims=" %%a IN (
q19366050.txt
) DO (
ECHO %%a|FIND "HsvDataSource.exe" >NUL
IF NOT ERRORLEVEL 1 SET keystring1=%%a
FOR %%b IN (USHFMPROD GSPROD TLPROD) DO (
ECHO %%a|FIND "%%b" >NUL
IF NOT ERRORLEVEL 1 IF DEFINED keystring1 CALL ECHO(%%keystring1%% %%b&SET "keystring1="
)
)
)>newfile.txt
TYPE newfile.txt
GOTO :EOF
数据应该在q19366050.txt中,报告在newfile.txt中生成。调整适合自己。
修订速度20131028T0725Z
@ECHO OFF
SETLOCAL
SET "keystring1="
(
FOR /f "delims=" %%a IN (
q19366050.txt
) DO (
ECHO %%a|FIND "HsvDataSource.exe" >NUL
IF ERRORLEVEL 1 (
IF DEFINED keystring1 (
FOR %%b IN (USHFMPROD GSPROD TLPROD) DO IF DEFINED keystring1 (
ECHO %%a|FIND "%%b" >NUL
IF NOT ERRORLEVEL 1 CALL ECHO(%%keystring1%% %%b&SET "keystring1="
)
)
) ELSE (SET keystring1=%%a)
)
)>newfile.txt
TYPE newfile.txt
GOTO :EOF
这里看起来很奇怪的是多次使用IF DEFINED keystring1
。
第一个实例确保仅在找到可执行文件后才执行内部FOR
。
下一个实例确保在找到%%b
后,不会对剩余的目标字符串执行耗时的代码管道回声。
如果目标字符串按频率顺序列出,则会有一个微小的进一步改善,因此如果字符串出现60%/ 30%/ 10%的时间,那么60%的时间只有1 {{1}将被执行; 2 ECHO
30%和3 ECHO
10%。
样本数据的实际运行时间(并且我没有回忆到我得到的地方......)与原始版本相差80秒,此版本为34秒;使用99K源文本运行。