为什么这个代码说回声是closures的?

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

任何帮助表示赞赏。

Solutions Collecting From Web of "为什么这个代码说回声是closures的?"

如果你的变量在某个地方是空的,它将和自己的命令“echo”一样,只是打印回显的状态。

为了避免这种情况,你应该用这样的东西替换所有的echo命令:

 echo var2: %var2% 

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

正如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因为这将确保回应一个空行,即使变量是空的。

不知道,如果这个职位仍然阅读,但不过。 您应该尝试以下操作:在@echo off之后的代码之上,您必须输入

  setlocal enabledelayedexpansion 

另外,如果你想要使用变量的变量(如For-LoopsIf's ),你必须把%变成! 得到!varname!

这应该是帮助…

问候

geisterfurz007

在这里输入图像说明 首先在同一个目录中创建一个文件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 

运行这个浴文件..你会发现一个子字符串(开始= 5,长度= 3)的字符串的第一行你有一个新创建的文件test.txt。 终于搞定了!

你的问题的解决方案是在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 

这样你可以看到你想要的解决方案。 干杯! ]