这段代码有什么问题?它说
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
如有任何帮助,我们将不胜感激。
如果你的变量在某处为空,则与单独使用命令“echo”相同,它只会打印 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-Loops
或If's
)的地方,您必须将%
更改为!
才能获得
!varname!
首先在你有这个批处理文件的同一目录中创建一个文件a.txt...在其中写入一些文本...注意:仅限Windows 2000 视窗ME 视窗XP 视窗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
运行这个bath文件..您将在新创建的文件test.txt中找到a.txt中第一行字符串的子字符串(start = 5,length = 3)。终于成功了!
问题的解决方案是将“echo”放在 if 块完成之后。 试试这个:
@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
这样您就可以看到您想要的解决方案。 干杯! ;]