为什么这段代码说回显已关闭?

问题描述 投票:0回答:5

这段代码有什么问题?它说

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

如有任何帮助,我们将不胜感激。

windows batch-file cmd
5个回答
72
投票

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

为了避免这种情况,您应该将所有

echo
命令替换为如下内容:

echo var2: %var2%

这样,如果

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


31
投票

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


15
投票

不确定这篇文章是否仍然被阅读,但无论如何。 您应该尝试以下操作: 在

@echo off
之后的代码顶部,您必须输入

 setlocal enabledelayedexpansion

此外,在任何想要使用括号块中更改的变量(例如

For-Loops
If's
)的地方,您必须将
%
更改为
!
才能获得
!varname!


0
投票

enter image description here首先在你有这个批处理文件的同一目录中创建一个文件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)。终于成功了!


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.