Ошибка командной строки echo off

What is wrong with this code? It says 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

Any help is appreciated.

Ross Ridge's user avatar

Ross Ridge

38.2k7 gold badges80 silver badges111 bronze badges

asked Jan 15, 2013 at 9:43

user1979801's user avatar

3

If your variable is empty somewhere, it will be the same as having the command «echo» on its own, which will just print the status of echo.

To avoid this, you should replace all your echo commands with something like this:

echo var2: %var2%

That way, if %var2% is empty it will just print «echo var2:» instead of «echo off».

answered Jan 15, 2013 at 9:56

laurent's user avatar

laurentlaurent

87.7k77 gold badges287 silver badges425 bronze badges

4

As Laurent stated, it’s not a problem of the ECHO, it’s a problem of your code.

In batch files, blocks are completely parsed before they are executed.
While parsing, all percent expansion will be done, so it seems that your variables can’t be changed inside a block.

But for this exists the delayed expansion, the delayed expansion will be evaluated in the moment of execution not while parsing the block.

It must be enabled, as per default the delayed expansion is disabled.

@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

I used here the construct echo( instead of echo as this will ensure echoing an empty line even if the variable is empty.

answered Jan 15, 2013 at 11:54

jeb's user avatar

jebjeb

78.1k17 gold badges171 silver badges224 bronze badges

1

Not sure, if this post is still read, but nevertheless.
You should try the following:
On top of the code right after @echo off you have to put in

 setlocal enabledelayedexpansion

Additionally anywhere you want to use variables changed in a block of brackets (like For-Loops or If's) you have to change the %into ! to get
!varname!

This should be helping…

Greetings

geisterfurz007

answered Aug 25, 2016 at 9:44

geisterfurz007's user avatar

geisterfurz007geisterfurz007

5,2025 gold badges32 silver badges53 bronze badges

1

enter image description hereFirst create a file a.txt in the same directory u have this batch file … write some text in that…Note: only Windows 2000
Windows ME
Windows XP
Windows Vista
Windows 7 supports 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

run this bath file .. you will find a substring(start=5,length=3) of the first line of string you have in a.txt in a newly created file test.txt. Finally got it working !

answered Jan 15, 2013 at 10:33

Manoj Purohit's user avatar

Manoj PurohitManoj Purohit

3,4131 gold badge15 silver badges17 bronze badges

3

The solution for your problem is to put the «echo»s after the if block is completed.
Try this:

@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

This way you can see the solution as you wanted.
Cheers! ;]

answered Oct 15, 2013 at 1:22

jfajunior's user avatar

jfajuniorjfajunior

1,1821 gold badge14 silver badges19 bronze badges

> echo /?
Displays messages, or turns command-echoing on or off. 
 
ECHO [ON | OFF] 
ECHO [message] 
 
Type ECHO without parameters to display the current echo setting.  

The echo command can display messages, variables and/or messages and variables on the screen, but it can also return the current status to the echo command, since this is a definition for the behavior of to send (or echo) action.

To one or more commands in your script/prompt, which will not occur when set to omit them (echo off).

Since your variable does not have a value (at run time), your %variable% == "" (nothing, no strings/characters), so, the cmd.exe (command line interpreter) will execute the command echo %var% as echo (only).

The echo off however assigned to the entire script, made at the beginning of it, as soon as the command echo noting |or| echo is used, (as it happens in its variable with no assigned value/var to display), it will display the current status for the echo command, as there are no strings to display on the screen.

  • For testing/debugging purposes, you can avoid these messages using:
echo. %var%
echo; %var%
echo/ %var%
echo %var%
echo= %var%
echo+ %var%
echo( %var%
echo[ %var%
echo: %var%

Since there is no value in the runtime variable, any of the above echo * commands returns a blank line:


your code... 
echo= %var%
...
  • Returns:
var="apple"

"Text2"
var="orange"

"Text2"
var="pear"

"Text2"
var="lemon"

"Text2"
Press any key to continue . . .

  • To set and use/access your array index items, you can use:

Split String Into Substrings Based on Delimiter / dostips.com

@echo off

setlocal enabledelayedexpansion
set "_array=apple,orange,pear,lemon"

set "_array_0=%_array:,=" & set /a _i+=1 & set "_array_!_i!=%"
for /l %%i in (0 1 !_i!)do echo:_array_%%~i == "!_array_%%~i!"

%__AppDir__%TimeOut.exe /t 000000010 /nobreak | <con: endlocal
  • Results:
_array_0 == "apple"
_array_1 == "orange"
_array_2 == "pear"
_array_3 == "lemon"

Obs.: It is good practice to use the endlocal when it is no longer needed.


  • Some alternative using loops to set array/index value:
@echo off && setlocal enabledelayedexpansion

set "_var=apple,orange,pear,lemon" && set/a "_i=100000-100001"
for %%i in (!_var!)do set/a "_i+=1"&&>con set "_var_!_i!=%%~i"
    
for /L %%L in (00,01,0!_i!)do echo _var_%%~L == "!_var_%%~L!"
%__AppDir__%TimeOut.exe /t 000000010 /nobreak | <con: endlocal
  • Results:
 _var_0 == "apple"
 _var_1 == "orange"
 _var_2 == "pear"
 _var_3 == "lemon"

Additional resources:

  • Echo /?
  • Timeout /?
  • Redirection
    • |, <, >, 2>, etc.
  • Conditional Execution
    • || and &&
    • Setlocal & Endlocal
  • How does the Windows Command Interpreter [cmd.exe] Parse Scripts

The Microsoft article Using command redirection operators explains the 3 standard handles and how to redirect them to another handle, command, device, file or console application.

Redirection of output written to handle 1 — STDOUT — to a file should be done with just

  • using > … create file if not already existing or overwrite existing file, or
  • using >> … create file if not already existing or append to existing file.

The redirection operators are usually appended at end of a command line. But this is problematic in case of using command ECHO and the string output to STDOUT ends with 1 to 9.

One of several solutions is to specify in this case the redirection at beginning of the command line:

@for /F "delims=" %%x in (TimesRun.txt) do @set Build=%%x
@set /A Build+=1
@echo Build value : %Build%
>>TimesRun.txt echo %Build%

Executing this small batch file without @echo off at top from within a command prompt window shows what Windows command processor executes after preprocessing each line with text file TimesRun.txt containing currently the value 0 or does not exist at all.

echo 1 1>>TimesRun.txt

It can be seen that Windows command interpreter moved the redirection to end of line with inserting a space and 1 left to >>.

With above batch code the line with >> really executed after preprocessing is:

echo 2 1>>TimesRun.txt

Specifying the redirection at end with 1>>, i.e. use in the batch file

echo %Build%1>>TimesRun.txt

is also no good idea as this would result on first run in executing the line:

echo 11 1>>TimesRun.txt

So 11 is written into the file instead of 1. This wrong output could be avoided by inserting a space before >> or 1>>, i.e. use one of those two:

echo %Build% >>TimesRun.txt
echo %Build% 1>>TimesRun.txt

But then the space after %Build% is also written into the file as really executed is:

echo 1  1>>TimesRun.txt

The trailing space would be no problem here, but should be nevertheless avoided.

Note: On using arithmetic operations, i.e. set /A ... any string not being a number or operator is automatically interpreted as variable name and the current value of this variable is used on evaluating the arithmetic expression. Therefore after set /A with environment variable names consisting only of word characters and starting with an alphabetic character as usually used for environment variables no %...% or !...! must be used inside the arithmetic expression. This is explained in help of command SET output into console window on running set /? within a command prompt window.

EvilDog17

11 / 11 / 8

Регистрация: 06.01.2018

Сообщений: 134

1

04.05.2018, 22:12. Показов 2900. Ответов 8

Метки bat, win 10, winbatch, windows 10 (Все метки)


Студворк — интернет-сервис помощи студентам

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@echo off
 
rem Игра Баше
 
set /a N=15
set /a M=3
echo N=%N%
echo M=%M%
:play
    if N leq 0 (
        rem ход компьютера
        set /a x1=%random%*3/32768+1
        echo Computers turn: 
        echo %x1%
        set /a N=%N%-%x1%
        echo N=%N%
        if N leq 0 (echo Computer won)
        rem ход игрока
        set /p x2=Players turn: 
        if /a %x2% lss 1 (set input=wrong)
        if /a %x2% gtr /a %M% (set input=wrong)
        if input==wrong (goto :PlTrn) else (echo %x2%)
        if N leq 0 (echo Player won)
        goto :play
    ) else (
        pause
    )

Результат выполнения скрипта — многократный вывод на экран сообщения ECHO is off.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

04.05.2018, 22:12

Ответы с готовыми решениями:

echo не выводит php код
Здравствуйте!
Есть 2 php файла: index.php, logo.php. В index.php добавляю logo.php:
&lt;?php…

Почему echo не выводит текст «-n»
Здрасти, пытаюсь разобрать параметры скрипта, но по какой-то причине параметр -n игнорируется, хотя…

Вывести символы, используя только три ECHO. Echo ‘0’, Echo ‘*’, Echo ‘n’ (использовать цикл)
Вывести символы, используя только три ECHO. Echo ‘0’, Echo ‘*’, Echo ‘n’ (использовать цикл)….

Код выводит нуль, почему?
Ребят, помогите пожалуйста решить мою проблему…..этот код выводит нуль, почему?

using…

8

alpap

4332 / 2122 / 661

Регистрация: 26.04.2015

Сообщений: 6,823

04.05.2018, 23:45

2

EvilDog17,
а вы сами как думаете?
у вас:

Windows Batch file
1
2
3
4
if N leq 0 (
 if N leq 0 (
 if N leq 0 (
...

кому это под силу понять?

Чтобы не запутаться в ifах и скобках делайте так:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if N leq 0 call :p1
if N==0 call :p2
if not N==0 call :p3
echo код
pause& exit
 
:p1
 echo код
exit /b
 
:p2
 echo код
exit /b
 
:p3
 echo код
exit /b



0



11 / 11 / 8

Регистрация: 06.01.2018

Сообщений: 134

05.05.2018, 00:20

 [ТС]

3

Цитата
Сообщение от alpap
Посмотреть сообщение

а вы сами как думаете?

Никак. Если бы у меня были предположения, то я формулировал бы вопрос по-другому.

Цитата
Сообщение от alpap
Посмотреть сообщение

кому это под силу понять?

Я же вроде не нарушаю синтаксиса языка этими ифами… Или нарушаю?..



0



YuS_2

Любознательный

4734 / 1116 / 263

Регистрация: 10.03.2016

Сообщений: 2,541

05.05.2018, 08:49

4

Цитата
Сообщение от EvilDog17
Посмотреть сообщение

Я же вроде не нарушаю синтаксиса языка этими ифами… Или нарушаю?

Вы сравнивать пытаетесь букву с цифрой, это раз
Внутри оператора скобки, переменные с результатом полученным в этих же скобках, раскрывать необходимо по-другому, это два.
Ну и с, собственно, синтаксисом полная беда… это три.
В общем…результат может быть непредсказуем с точки зрения обычной логики

Если не касаться самого алгоритма игры и с поправками синтаксиса, то, как минимум, должно быть так:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@echo off
setlocal enabledelayedexpansion
rem Игра Баше
 
set /a N=15
set /a M=3
echo N=%N%
echo M=%M%
:play
if %N% gtr 0 (
    rem ход компьютера
    set /a x1=!random!*3/32768+1
    echo Computers turn: 
    echo !x1!
    set /a N=N-x1
    echo N=!N!
    if !N! leq 0 (echo Computer won)
    rem ход игрока
    set /p x2=Players turn: 
    if !x2! lss 1 (set input=wrong)
    if !x2! gtr !M! (set input=wrong)
    if "!input!"=="wrong" (goto :PlTrn) else (echo !x2!)
    if !N! leq 0 (echo Player won)
    goto :play
) else (
    pause
)

кроме одного места: goto :PlTrn — такой метки нигде не существует…



0



EvilDog17

11 / 11 / 8

Регистрация: 06.01.2018

Сообщений: 134

05.05.2018, 11:26

 [ТС]

5

YuS_2, я переделал код:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@echo off
setlocal enabledelayedexpansion
 
rem Игра Баше
 
set /a N=15
set /a M=3
echo N=%N%
echo M=%M%
:play
if N leq 0 (
    rem ход компьютера
    set /a x1=!random!*3/32768+1
    echo Computers turn: 
    echo !x1!
    set /a N=N-x1
    echo N=!N!
    if !N! leq 0 (echo Computer won)
    rem ход игрока
    :PlTrn
    set /p x2=Players turn: 
    if !x2! lss 1 (set input=wrong)
    if !x2! gtr !M! (set input=wrong)
    if "!input!"=="wrong" (goto :PlTrn) else (echo !x2!)
    if !N! leq 0 (echo Player won)
    goto :play
) else (
    pause
)

Он всё равно, конечно жк работает не так как я хочу. Можно ли эту программу без goto написать как-то?



0



YuS_2

Любознательный

4734 / 1116 / 263

Регистрация: 10.03.2016

Сообщений: 2,541

05.05.2018, 16:50

6

Лучший ответ Сообщение было отмечено EvilDog17 как решение

Решение

EvilDog17,

Цитата
Сообщение от EvilDog17
Посмотреть сообщение

конечно жк работает не так как я хочу

Вы его как-то странно переделываете… ну, хорошо, вот Вам код, который работает:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@echo off
setlocal enabledelayedexpansion
rem Игра Баше
set /a N=15
set /a M=3
echo N=%N%
echo M=%M%
echo.Start
echo.----
:play
set "x1="
set "x2="
if %N% gtr 0 (
    rem ход компьютера
    set /a x1=!random!*3/32768+1
    echo Computers turn: 
    echo !x1!
    set /a N=N-x1
    echo N=!N!
    if !N! leq 0 (echo Computer won&echo.----&call :ver&goto play)
    rem ход игрока
    :PlTrn
    set "input="
    set /p x2=Players turn: 
    if !x2! lss 1 (set input=wrong)
    if !x2! gtr !M! (set input=wrong)
    if "!input!"=="wrong" (goto PlTrn) else (echo !x2!)
    set /a N-=x2
    if !N! leq 0 (echo Player won&echo.----&call :ver&goto play)
    goto play
) else (
    pause&exit
)
exit
:ver
set /a N=15
choice /t 5 /d N /m "Continue?"
if errorlevel 2 set N=0
echo.----
exit /b

Цитата
Сообщение от EvilDog17
Посмотреть сообщение

Можно ли эту программу без goto написать как-то?

Можно, но не в cmd



1



EvilDog17

11 / 11 / 8

Регистрация: 06.01.2018

Сообщений: 134

05.05.2018, 17:24

 [ТС]

7

YuS_2, большое спасибо. Однако, у меня есть пара вопросов по поводу кода.
1) Как работает

Windows Batch file
1
setlocal enabledelayedexpansion

?
2) Зачем точка после echo перед текстом, который нужно вывести?
3) Что делают строки 11, 12 и 23?
4) Отличается ли чем-то call от goto?
5) Зачем exit’ы в 32 и 34 строках?



0



Любознательный

4734 / 1116 / 263

Регистрация: 10.03.2016

Сообщений: 2,541

05.05.2018, 18:55

8

Лучший ответ Сообщение было отмечено vavun как решение

Решение

Цитата
Сообщение от EvilDog17
Посмотреть сообщение

1) Как работает

setlocal /?
включает отложенное расширение переменных, т.е. вот таким образом !x!, что позволяет их использовать внутри скобок с изменяемыми значениями.

Цитата
Сообщение от EvilDog17
Посмотреть сообщение

2) Зачем точка после echo перед текстом, который нужно вывести?

Просто привычка. Позволяет использовать команду echo с пустой строкой, без вывода доп. сообщений.

Цитата
Сообщение от EvilDog17
Посмотреть сообщение

3) Что делают строки 11, 12 и 23?

Странный вопрос. Обнуляются переменные.

Цитата
Сообщение от EvilDog17
Посмотреть сообщение

4) Отличается ли чем-то call от goto?

Конечно. call — вызов подпрограммы по метке или другого сценария, с возвратом. goto — безвозвратный переход на метку.

Цитата
Сообщение от EvilDog17
Посмотреть сообщение

5) Зачем exit’ы в 32 и 34 строках?

Выход из сценария, при невыполненном условии в строке 13. Второй exit (строка 34) скорее для подстраховки, он необязателен…



1



11 / 11 / 8

Регистрация: 06.01.2018

Сообщений: 134

05.05.2018, 21:41

 [ТС]

9

YuS_2, спасибо большое, переписал код под себя, основываясь на Ваших объяснениях.



0



Вывод на экран сообщения или задание режима вывода на экран сообщений команд. Вызванная без параметров команда echo выводит текущий режим.

Синтаксис

echo [{on|off}] [сообщение]

Параметры

{on|off}
Включение или отключения режима отображения на экране информации о работе команд.
сообщение
Задание текста для вывода на экран.
/?
Отображение справки в командной строке.

Примечания

  • Команда echo сообщение может оказаться полезной, если отключен режим отображения работы команд. Для вывода сообщений из нескольких строк без вывода дополнительных команд между ними следует использовать несколько последовательных команд echo сообщение после команды echo off в пакетной программе.
  • Если используется команда echo off, приглашение командной строки не отображается на экране. Чтобы отобразить приглашение, введите командуecho on.
  • Чтобы отключить вывод строк, введите символ «коммерческого эт» (@) перед командой в пакетном файле.
  • Чтобы вывести на экране пустую строку, введите следующую команду:

    echo.

  • Чтобы вывести символы канала (|) или перенаправления (< или >) при использовании команды echo, введите символ (^) непосредственно перед символом канала или перенаправления (например ^>, ^< или ^| ). Чтобы вывести символ (^), введите два этих символа подряд (^^).

Примеры

Следующий пример представляет собой пакетный файл, выводящий сообщение из трех строк на экран с пустыми строками до и после него:

echo off
echo.
echo Эта пакетная программа
echo форматирует и проверяет
echo новые диски
echo.

Если требуется отключить режим отображения команд и при этом не выводить на экран строку самой команды echo, введите символ @ перед командой:

@echo off

Оператор if и команду echo можно использовать в одной командной строке: Например:

if exist *.rpt echo Отчет получен.

При выводе русских букв необходимо помнить о кодировке. Текст сообщения должен быть в DOS (866) кодировке. Многие текстовые редакторы его поддерживают.
Если необходимо, что бы текст сообщений был в WIN (1251) кодировке и был виден из любого редактора, то можно использовать следующий прием. 

chcp 1251 >NUL
set x=Русский текст
chcp 866 >NUL
echo %x%
pause

Такие сообщения для удобства можно выделить в отдельный блок. 

chcp 1251 >NUL
set MSG01=Отсутствует исходный файл
set MSG02=Ошибка копирования
set MSG03=Успешное завершение программы
set TIT=Копирование файла
chcp 866 >NUL
Title %TIT%
….
echo %MSG01%
….
echo %MSG02%
….
echo %MSG03%

Если такой блок неудобно располагать в начале файла, то можно образовать из него процедуру, разместить в конце bat файла, а на исполнение вызвать эту процедуру командой call в начале bat файла. Из примера все должно стать понятнее)) 

….
call :blockmsg

Title %TIT%
….
echo %MSG01%
….
echo %MSG02%
….
echo %MSG03%
….
exit

:blockmsg
chcp 1251 >NUL
set MSG01=Отсутствует исходный файл
set MSG02=Ошибка копирования
set MSG03=Успешное завершение программы
set TIT=Копирование файла
chcp 866 >NUL
exit /b

Если сообщение одиночное, то можно извратиться поступить следующим образом: 

chcp 1251 >nul
for /f «delims=» %%A in («Отойдите на безопасное расстояние») do >nul chcp 866& echo.%%A

Понравилась статья? Поделить с друзьями:
  • Ошибка командной строки daemon tools
  • Ошибка команда не разрешена введенными кодами защиты лицензиями ккт
  • Ошибка команда не поддерживается объектом
  • Ошибка команда port не выполнена
  • Ошибка ком порты не обнаружены