我简化了我的问题:
@echo off
set res=
for /f "usebackq" %%f in (`find "a" list.txt`) do set res=%%f
echo %res%
pause>nul
and that things.txt file in the code is like:
list.txt文件中的代码为:
apple
pitch
pear
melon
mango
正如你所料,此代码的结果是
mango
因为“芒果”线位于“苹果”和“梨”线下方
但我想要的结果是
apple
或者
pear
具体来说,我想使用提供的选项键将上面的每个其他值mango
(例如apple
和)pear
放入变量中。res
有什么办法可以做到这一点?
答案1
这里只选择了最后一个匹配项,因为res
每次都会被覆盖。这将保存所有匹配项,并用空格分隔它们:
@echo off & setlocal enabledelayedexpansion & set "fruits="
for /f ^tokens^=^* %%a in ('type list.txt ^| find "a"') do set "fruits=!fruits! %%a"
set "fruits=!fruits:~1!
现在echo !fruits!
就给予apple pear mango
。
如果你想获得前两场比赛使用这个:
for /f "tokens=1,2 delims= " %%a in ("!fruits!") do echo %%a %%b
将给予apple pear
并保存在水果用途中do set "fruits=%%a %%b"
。您可以修改tokens
以选择由空格分隔的单词。
答案2
@Echo off
<con: CD /d "%~dp0" && Setlocal EnableDelayedExpansion
for /f %%i in (list.txt)do echo\%%i|find "a" >nul && (
set /a "_cnt+=1+0" && call set "_res_!_cnt!=%%~i" )
for /l %%L in (1 1 !_cnt!)do echo\_res_%%L==!_res_%%L!
endlocal
- 输出:
_res_1==apple
_res_2==pear
_res_3==mango
您可以使用for /f
循环,echo\"a"|find "a"
如果发现“a”,则运算符&&
将继续,并使用计数器来定义variable_counter_actual=current_occurrence
,以便您可以利用第一个和最后一个之间发生的任何事情。
对于使用示例,您有循环的输出for /l
,它将列出从 1 开始的所有出现情况,从 1 中的 1 到总数 (!_cnt!),每个!_res_%%L!
。
- 仅对于前两次出现的情况:
for /l %%L in (1 1 2)do echo\_res_%%L==!_res_%%L!
- 仅使用您想要的出现次数,例如第一次和第三次:
for %%L in (1,3)do echo\_res_%%L==!_res_%%L!
- 或者,只需使用:
echo\!_res_1!
echo\!_res_2!