it-roy-ru.com

Почему этот код говорит, что эхо выключено?

Что не так с этим кодом? Это говорит 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

Любая помощь приветствуется.

22
user1979801

Если ваша переменная где-то пуста, это будет то же самое, что иметь собственную команду "echo", которая просто выведет состояние echo.

Чтобы избежать этого, вы должны заменить все ваши команды echo чем-то вроде этого:

echo var2: %var2%

Таким образом, если %var2% пуст, он просто выведет «echo var2:» вместо «echo off».

29
this.lau_

Как сказал Лоран, это не проблема 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, так как это обеспечит отображение пустой строки, даже если переменная пуста.

18
jeb

Не уверен, если этот пост все еще читается, но тем не менее . Вы должны попробовать следующее: Вверху кода сразу после @echo off вы должны вставить

 setlocal enabledelayedexpansion

Кроме того, везде, где вы хотите использовать переменные, измененные в скобках (например, For-Loops или If's), вы должны изменить %into !, чтобы получить !varname!

Это должно помочь ...

Привет

geisterfurz007

5
geisterfurz007

enter image description hereСначала создайте файл a.txt в том же каталоге, у которого есть этот пакетный файл ... напишите в нем некоторый текст ... Примечание: только Windows 2000Windows MEWindows XPWindows 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

запустите этот файл ванны ... вы найдете подстроку (start = 5, length = 3) первой строки строки, которая у вас есть, в .txt во вновь созданном файле test.txt. Наконец-то все заработало!

0
Manoj Purohit

Решение вашей проблемы - поставить "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

Таким образом, вы можете увидеть решение, как вы хотели. Ура! ;] 

0
jfajunior