-3

我有一个包含内容的文本文件:

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
4

1 回答 1

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% 的时间只有 1ECHO会被执行;2ECHO秒 30% 和 3ECHO秒 10%。

样本数据的实际运行时间(我不记得我从哪里得到的......)原始版本为 80 秒,此版本为 34 秒;使用 99K 源文本运行。

于 2013-10-15T05:03:55.417 回答