一个批处理问题 (大概是循环代码块里的条件判断失效?具体内详)

基于在 【纯文本】在文本文件中批量搜索一批字符串rodger兄台提供的思路,写了个基于字典文件搜索文本文件并输出报告的批处理,但跑起来不大正常,于是把代码发在这里想向各位大能请教一下。

(别问我为什么不直接用 FINDSTR 命令,字典太大它罢工了)

构思是用FOR命令循环提取字典的一整行为一个搜索目标,然后用 FINDSTR 命令配合 ERRORLEVEL 进行一次静默搜索,如果没搜索到就直接跳过,如果搜索到了,就先用 ECHO 命令输出一行搜索目标,再用 FIND 命令输出详细的搜索结果。然后进入下一轮循环。

这么搞的目的是为了避免直接使用 FIND 命令导致的没有搜索结果时也在输出报告中大量写入诸如“---------- TARGET.txt”的无效内容。而现在的面临的问题也在此处,执行代码时发现前半段的判断代码似乎无效,即使没有结果也会执行后半段的三行输出指令。

下面是问题代码:

FOR /F "delims=" %%G IN (DICT.txt) DO (
	FINDSTR /l /i /m /c:"%%G" TARGET.txt
	IF %ERRORLEVEL% EQU 0 (
		ECHO %%G >>FINDRESULT.txt
		FIND /N "%%G" TARGET.txt >>FINDRESULT.txt
		ECHO:
	)
)

//每个关键词匹配的行
cat DICT.txt|xargs -i grep -n {} TARGET.txt
//每个关键词匹配的行数
cat DICT.txt|xargs -i grep -n {} -c TARGET.txt

我觉得你没必要特别纠结那些无效的行,因为一个查找替换就删除了。重要的是得到结果,除非是要做一个经常重复的工作,否则,过程的脚本都是可抛的。过滤掉内容可以用sed跑一遍。

1 Like

vbscript 是 VB 的一个子集。不过一般学 VB 都是先搞 GUI,而 vbs 则直接奔着命令去的。

其实学点 js 也不错,VSC 装一个 code run,在编辑器里直接运行。(保存以后从终端运行也可以)。总之,随便学一种脚本,搞这些问题都很方便。

1 Like

懂了,计划去研究一下……感觉一下子要学好多啊。总之多谢。

说个题外话,小时候我可喜欢在vb里画GUI了,经常对着电脑几个小时画出个贼漂亮贼复杂的窗口,然而背后的代码一行都没有。

那么你继续用 vb 啊。。vb6 一样能够运行在最新的 win10 里面,微软只是说不再增加新功能,没法不让运行了。vbscript 除了操作文件等少数地方和 vb6 不一样之外,像操作字符串,print 打印都是跟 vb 一样的,建议你花半天时间学习一下 ,以后就有一个技能了。

现在还有很多教授写程序用 fortran 呢。古老的技术未必不能用。

1 Like

原来还能用啊。我记得很久以前看到新闻说微软不再支持vb6、转向vb.net了,大概是那时候产生了新系统不会再支持vb6的印象了吧。能用就好……突然发现一个问题,我手里的vb6还是五元快乐盘来着的,可现在连光驱都找不到了。不知道msdn上有没有。感谢告知。

这个网站上面有很多巨硬的操作系统和开发软件下载:

1 Like

是啊,我说的msdn就是这个嘛。总之多谢~

其实 从上个问题 【纯文本】在文本文件中批量搜索一批字符串 ,我就好奇,你的 VSC 难道只是 Code Editor 吗? 如果是 IDE 随便编一个 岂不是很方便。。。总比 用批处理 要方便的多。。。

1 Like

CAT……这是Linux的命令?

说到不纠结,这个我双手赞同。后来也确实是靠查找替换和比对字典强行继续下去了。现在纠结这个主要是我还有不少同类的工作,所以有点想做个傻瓜化的工具。

我之前提到的,让你装个cmder。不能叫linux命令,是gnu的软件,linux标配而已,实际上,几乎所有工具都有win的二进制编译成果。grep,sed,awk用来操作文本数据非常方便,强烈建议你学学。不指望一口气全学,用一点学一点就好。

2 Likes

你可以用 vbscript 来处理。在 windows 里面,只要把 vb 代码写在 .vbs 文件里面,这个 vbs 文件就能够执行了。支持从 win98 到 win10 所有版本。

rem test.vbs
msgbox "hello, there."

双击运行,或者用 cscript 运行:

C:\> cscript test.vbs

windows 里面这样的黑科技很多,比如一个 html 改名 .hta 扩展名就能打开一个独立的窗口。

1 Like

感觉vbscript感觉和我印象中的basic语言不大一样啊。容我这两天有空时研究研究。非常感谢~

你猜怎么着?你猜中了!其实我除了basic还剩点基础没忘,其它的语言基本上就只是看得懂的程度而已……然后因为我的basic还停留在vb6的时代……后面我觉得可以不用说下去了吧。

至于我的vscode?那是拿来写md的。

补充一下,这是一段 vbscript 里面处理文件的代码:

Set objFS = CreateObject("Scripting.FileSystemObject")
strFile = "c:\test\file.txt"
strTemp = "c:\test\temp.txt"
Set objFile = objFS.GetFile(strFile)
Set objOutFile = objFS.CreateTextFile(strTemp,True)
Set ts = objFile.OpenAsTextStream(1,-2)
Do Until ts.AtEndOfStream
    strLine = ts.ReadLine
    ' do something with strLine 
    objOutFile.Write(strLine)
Loop
objOutFile.Close
ts.Close
objFS.DeleteFile(strFile)
objFS.MoveFile strTemp,strFile

更具体的文件调用你可以网上搜索一下,应该有很多资料。

1 Like

唔,一开始我没理解那条回复……感觉需要研究的东西像滚雪球一样越来越多了呢,总之非常感谢,容我去研究研究

我以前 也用 Cmder ,但是,后来我发现 Matlab 的 万能 之后,我就基本都用 Matlab 了。。。只有一些需要脱离环境的,我更倾向与 使用 PowerShell ,感觉更灵活

2 Likes

那些命令跟 bat 一样恶心。。我用 linux 20 年了——至今不想碰那堆 linux 命令。什么事情都是用桌面工具或者 python 写脚本搞定。

1 Like