![使用批处理、JScript(JREPL?)或 VBScript 按照指定的顺序匹配文本文件(图像列表)中的行?](https://linux22.com/image/1487047/%E4%BD%BF%E7%94%A8%E6%89%B9%E5%A4%84%E7%90%86%E3%80%81JScript%EF%BC%88JREPL%EF%BC%9F%EF%BC%89%E6%88%96%20VBScript%20%E6%8C%89%E7%85%A7%E6%8C%87%E5%AE%9A%E7%9A%84%E9%A1%BA%E5%BA%8F%E5%8C%B9%E9%85%8D%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%EF%BC%88%E5%9B%BE%E5%83%8F%E5%88%97%E8%A1%A8%EF%BC%89%E4%B8%AD%E7%9A%84%E8%A1%8C%EF%BC%9F.png)
环境是WindowsXP(可能很快会升级到Windows7)。我可以运行脚本,但不允许安装工具。
任务:
从 Log.txt 文件中输出匹配的行同一订单作为搜索词列表(Tokens.txt,每行一个标记),这些搜索词是从 StartingList.txt(文件路径的文本列表,可作为批处理文件的 %1 使用)中提取的。
问题:(以及解决方法)
以下方法1:命令行 FindStr变化顺序(相对于列出的搜索词的顺序)。一种解决方法是使用 FOR 循环:
以下方法2:使用 FindStr 进行批量 FOR 循环非常慢和变化一些字符(超出 32 到 126 的范围,命令行字体和字符集可能与底层 Windows Unicode 支持不一致 - 有关字符方面的更多信息,请参阅问题 157225)。解决方法禁止使用 32 到 126 这个“安全”范围之外的字符,或者对任何改变的字符运行尾端“查找和替换”。
可能的解决方案:(这是我需要帮助的地方......)
等效的 Unicode 感知 VBScript 或 JScript(可能也使用 JREPL)将解决速度慢的问题并支持所有 Unicode 字符。
请提供这些脚本语言中功能等效的 FOR 循环的示例以提供帮助。
最接近的 JREPL 方法是由 dbenham 在问题 1052645 中提供的,以及在以下位置提供的: http://www.dostips.com/forum/viewtopic.php?p=39534#p39534
示例 StartingList.txt:
D:\Pics\2005-03-27 Bristol\2005-03-27 DSC_0016#.JPG
D:\Pics\2005-03-26 Brighton\2005-03-26 DSC_0014#^{!k¿m.JPG
D:\Pics\2005-03-26 London\2005-03-26 DSCN0015#.JPG
D:\Pics\2005-03-28 Bath\2005-03-30 _DSC0019#.JPG
D:\Pics\2005-03-28 Bath\2005-03-29 P01_0018#.JPG
示例 Tokens.txt:
DSC_0016#
DSC_0014#
DSCN0015#
_DSC0019#
P01_0018#
示例 Log.txt:
F:\Pics\Edited\2005-03-28 Bath\2005-03-30 _DSC0019#.JPG
F:\Pics\Edited\2005-03-28 Bath\2005-03-29 P01_0018#.JPG
F:\Pics\Edited\2005-03-28 Bath\2005-03-28 DSC_0017#.JPG
F:\Pics\Edited\2005-03-27 Bristol\2005-03-27 DSC_0016#.JPG
F:\Pics\Edited\2005-03-26 London\2005-03-26 DSCN0015#.JPG
F:\Pics\Edited\2005-03-26 Brighton\2005-03-26 DSC_0014#^{!k¿m.JPG
示例 StartingList(updated).txt:
F:\Pics\Edited\2005-03-27 Bristol\2005-03-27 DSC_0016#.JPG
F:\Pics\Edited\2005-03-26 Brighton\2005-03-26 DSC_0014#^{!k¿m.JPG
F:\Pics\Edited\2005-03-26 London\2005-03-26 DSCN0015#.JPG
F:\Pics\Edited\2005-03-28 Bath\2005-03-30 _DSC0019#.JPG
F:\Pics\Edited\2005-03-28 Bath\2005-03-29 P01_0018#.JPG
方法 1:
::method1
type nul >%1
findstr /G:Tokens.txt Log.txt >%1(updated).txt
方法 2:
::method2
setlocal enableDelayedExpansion
type nul >%1
for /F "tokens=*" %%i in (Tokens.txt) do (
findstr /C:"%%i" Log.txt >>%1(updated).txt
)
方法 3:
理想情况下,解决方案是这样的,可能使用 JREPL,将搜索参数作为文本列表传递,可能使用管道输入或输出,可能连接到另一个 JREPL?问题 850183 的解决方案看起来很接近,但我的退休大脑无法弥补差距 - 对我的拙劣尝试表示歉意:
否则,纯 JScript 或 VBScript 示例将会有所帮助。
::method3 [pseudo Jscript in square brackets is where I need help please]
type nul >%1
Call jrepl "[Read in Tokens.txt, match each token IN LISTED ORDER]" "[if (token==match, output matched line)]" /jmatch /jbeg "[cnt]" /f Log.txt /o >%1(updated).txt