: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
答案 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 即可返回菜单。