显示多个匹配行批次

时间:2017-04-08 22:23:58

标签: windows batch-file cmd

:show 
cls  
echo ==============================  
echo =         Transactions       =  
echo ==============================  

set /p account_date=Enter the date of the transaction :   

set flag=0  

for /f "tokens=1-3 delims=," %%a in ('findstr /i /l /c:"!account_date!"  "log.txt"') do (  

if %%a==!account_date! (  
        echo Transaction date        Account name       amount  
        echo %%a                     %%b                %%c  
        set flag=1 

        )
if !flag!==0 echo Record was Not found   
PAUSE   
cls   
goto show       

)  

pause 

cls 

 1. List item

goto menu 

我试图在文本文件中显示与用户输入的日期相匹配的所有行。例如,如果用户输入了' 2017-04-08'然后它将显示该日期的所有行。但到目前为止,我只能显示第一个匹配的行。我将如何显示所有匹配的行?

  

2017-04-08 Faiz 2000
  2017-04-08 Faiz 3000
  2017-04-08 Faiz 1000

1 个答案:

答案 0 :(得分:0)

{修订机构]

set /p account_date=Enter the date of the transaction :   
set "flag="

for /f "tokens=1-3 delims=," %%a in ('findstr /i /l /c:"%account_date%"  "log.txt"') do (  

if %%a==%account_date% (  
   if not defined flag echo Transaction date        Account name       amount  
   echo %%a                     %%b                %%c  
   set flag=1
   )
)
if not defined flag echo Record was Not found   
PAUSE   
goto show       

评论:

您提供的数据不包含逗号,因此if %%a==!account_date!永远不应评估为true。您需要将delims字符更改为空格才能使用您提供的数据。

我们必须假设您使用过setlocal enabledelayedexpansion。假设是危险的 - 请明确(即包括显示你已经想到这一点的线......)

请注意,在!var!循环之外%var% == for只需要在循环内更改!var!时调用var您想要访问已更改的值。因此,您向我们展示的代码段中实际上不需要!var!

将变量设置为 nothing 意味着它不再被定义。将其设置为其他任何意味着它已定义。 if defined指令解释变量的当前状态。语法SET "var=value"(其中value可以为空)用于确保任何杂散尾随空格不包含在分配的值中。 set /a可以安全地使用“无报价”。

所以 - 代码首先将flag设置为 nothing ,然后在第一个匹配时解释flag。如果未设置,请生成标题并将flag设置为某些内容

整个for循环执行完毕后,flag将被设置或不被设置,因此可用于生成“无匹配”消息。

我建议

set "account_date="
set /p account_date=Enter the date of the transaction :   
if not defined acount_date goto menu
set "flag="

set /p中按 Enter 会使变量保持不变 - 它不会将其设置为 nothing ,因此您需要首先要这样做。使用此代码,您只需检测 Enter 即可返回菜单。