批处理中的 [for /f "usebackq" %%f in (`find "" path`) do] 语句的选项

批处理中的 [for /f "usebackq" %%f in (`find "" path`) do] 语句的选项

我简化了我的问题:

@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!

相关内容