41

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

任何帮助表示赞赏。

4

5 回答 5

64

如果您的变量在某处为空,则与单独使用命令“echo”相同,它只会打印 echo 的状态。

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

echo var2: %var2%

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

于 2013-01-15T09:56:59.707 回答
25

正如 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因为这将确保即使变量为空也能回显一个空行。

于 2013-01-15T11:54:16.083 回答
12

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

 setlocal enabledelayedexpansion

此外,在任何您想使用在括号中更改的变量的任何地方(如For-Loopsor If's),您都必须将in 更改%!!varname!

这应该有帮助...

问候

geisterfurz007

于 2016-08-25T09:44:26.560 回答
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

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

于 2013-10-15T01:22:22.120 回答
0

在此处输入图像描述首先在你有这个批处理文件的同一目录中创建一个文件 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

运行这个bath文件..你会在新创建的文件test.txt中找到你在a.txt中的第一行字符串的子字符串(start=5,length=3)。终于让它工作了!

于 2013-01-15T10:33:23.330 回答