从file1
检索file2
的字符串的批处理文件
file1.txt
aaa.dll
ccc.dll
ddd.sys
file2.txt
aaa.dll=c:\windows\aaa.dll
bbb.dll=c:\windows\bbb.dll
ccc.dll=c:\windows\system32\ccc.dll
ddd.sys=c:\windows\system32\drivers\ddd.sys
eee.log=c:\windows\debug\wia\eee.log
预期结果
c:\windows\aaa.dll
c:\windows\system32\ccc.dll
c:\windows\system32\drivers\ddd.sys
测试命令
for /f "tokrns=*" %%i ('findstr file1.txt file2.txt') do (set result=%%i)
答案 0 :(得分:0)
我假设file2.txt
本质上是“配置设置”列表...即名称- value 对的列表。此外,file1.txt
是要获取其值的名称的列表。
在这种情况下,您需要为findstr
中的每行每行运行file1.txt
命令。例如:
getvalues.bat
@echo off
setlocal
set "REQUIRED=file1.txt"
set "SETTINGS=file2.txt"
for /f "usebackq tokens=*" %%a in ( "%REQUIRED%" ) do (
for /f "tokens=1,* delims==" %%b in ( 'findstr /b "%%a=" "%SETTINGS%"' ) do (
echo %%c
)
)
产生以下内容:
C:\>getvalues.bat
c:\windows\aaa.dll
c:\windows\system32\ccc.dll
c:\windows\system32\drivers\ddd.sys
注释
我已经硬编码了REQUIRED
(名称列表以获取 values 的名称)和SETTINGS
(该列表名称-值对)。根据您的要求,您可以从命令行中选择一个或多个。
第一个循环遍历REQUIRED
(= file1.txt
)中的所有行。之所以使用usebackq
是因为文件名用双引号引起来,以防万一它包含空格。
对于第一个循环(%%a
)中的每个名称,我们运行一个findstr
命令。 /b
告诉它在行的开头查找模式。我还要在 name 的末尾附加一个=
。两者都有助于防止意外的部分匹配。
tokens=1,* delims==
在第一个(或唯一的)等号处分割findstr
的输出。名称(在=
之前)将分配给%%b
,值(所有其余值)将被分配到%%c
。
答案 1 :(得分:0)
您不需要比较任何东西即可获取先前已定义的字符串(即变量值):
@echo off
setlocal EnableDelayedExpansion
rem Define the strings from file2.txt
for /F "delims=" %%a in (file2.txt) do set "%%a"
rem Retrieve the strings indicated in file1.txt
for /F %%a in (file1.txt) do echo !%%a!
如果您坚持使用“查找字符串”方式:
for /F "tokens=2 delims==" %%a in ('findstr /G:file1.txt file2.txt') do echo %%a