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

时间:2013-01-15 09:43:07

标签: windows batch-file cmd

这段代码有什么问题?它说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

感谢任何帮助。

5 个答案:

答案 0 :(得分:35)

如果你的变量在某个地方是空的,它将与单独使用命令“echo”相同,这将只显示echo的状态。

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

echo var2: %var2%

这样,如果%var2%为空,它只会打印“echo var2:”而不是“echo off”。

答案 1 :(得分:20)

正如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

我在这里使用了构造echo(而不是echo,因为这样可以确保即使变量为空也会回显空行。

答案 2 :(得分:6)

不确定,如果这篇文章仍然被阅读,但仍然如此。 您应该尝试以下方法: 在@echo off之后的代码之上,你必须放入

 setlocal enabledelayedexpansion

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

这应该有帮助...

问候

geisterfurz007

答案 3 :(得分:0)

enter image description here首先在同一个目录中创建一个文件a.txt你有这个批处理文件...写一些文本...注意:只有Windows 2000 Windows ME Windows XP Windows Vista Windows 7支持FINDSTR

set /p pattern=Enter id:
findstr %pattern% a.txt > __query.tmp
set /p result=<__query.tmp
if %errorlevel%==0 (
set var2= %result%
echo %var2%
set var1= %var2:~5,3%
echo %var1% > test.txt
echo %var1%
) else (
echo error
)
del __query.tmp
pause

运行此浴文件..您将在新创建的文件test.txt中找到a.txt中第一行字符串的子字符串(start = 5,length = 3)。终于搞定了!

答案 4 :(得分:0)

问题的解决方案是在if块完成后放置“echo”。 试试这个:

@ECHO off
set /p pattern=Enter id:
findstr %pattern% .\a.txt > result
if %errorlevel%==0 (
    set var2= <result
    set var1=%var2:~5,3%
    goto print 
) else (
    echo error
    goto result
)
:print
echo %var2%
echo %var1% > test.txt
echo %var1%

:result
del result
pause

通过这种方式,您可以根据需要查看解决方案。 干杯! ;]