为什么这段代码表示回声已关闭?

use*_*801 27 windows cmd batch-file

这段代码有什么问题?它说ECHO is off.

@ECHO off
set /p pattern=Enter id:
findstr %pattern% .\a.txt > result
if %errorlevel%==0 (
set var2= <result
echo %var2%
set var1=%var2:~5,3%
echo %var1% > test.txt
echo %var1%
) else (
echo error
)
del result
pause
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏.

lau*_*ent 39

如果你的变量在某处是空的,那么它将与自己的命令"echo"相同,这将只显示echo的状态.

为避免这种情况,您应该使用以下内容替换所有echo命令:

echo var2: %var2%
Run Code Online (Sandbox Code Playgroud)

这样,如果%var2%是空的,它将只打印"echo var2:"而不是"echo off".

  • 关于“某处变量为空=回声状态”的好答案......谢谢! (2认同)

jeb*_*jeb 21

正如Laurent所说,这不是问题ECHO,这是你的代码问题.

在批处理文件中,块在执行之前会被解析完成.
虽然将解析所有百分比扩展,但似乎您的变量无法在块内更改.

但是为了存在延迟扩展,延迟扩展将在执行时评估,而不是在解析块时.

必须启用它,默认情况下禁用延迟扩展.

@ECHO off
setlocal EnableDelayedExpansion
set /p pattern=Enter id:
findstr %pattern% .\a.txt > result
if %errorlevel%==0 (
  set var2= <result
  echo(!var2!
  set var1=!var2:~5,3!
  echo(!var1! > test.txt
  echo(!var1!
) else (
  echo error
)
del result
Run Code Online (Sandbox Code Playgroud)

我在这里使用了构造echo(而不是echo因为这将确保即使变量为空也会回显空行.


gei*_*aos 7

不确定,如果这篇文章仍在阅读,但仍然如此.您应该尝试以下操作:在@echo off您必须放入之后立即执行代码

 setlocal enabledelayedexpansion
Run Code Online (Sandbox Code Playgroud)

此外,您想要在括号块(例如For-LoopsIf's)中更改变量的任何地方,您必须将%into 更改为!get !varname!

这应该有帮助......

问候

geisterfurz007