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
38.2k7 gold badges80 silver badges111 bronze badges
asked Jan 15, 2013 at 9:43
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
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
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
geisterfurz007geisterfurz007
5,2025 gold badges32 silver badges53 bronze badges
1
First 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 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
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 (Все метки)
Результат выполнения скрипта — многократный вывод на экран сообщения ECHO is off.
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
04.05.2018, 22:12 |
Ответы с готовыми решениями: echo не выводит php код Почему 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,
кому это под силу понять? Чтобы не запутаться в ifах и скобках делайте так:
0 |
11 / 11 / 8 Регистрация: 06.01.2018 Сообщений: 134 |
|
05.05.2018, 00:20 [ТС] |
3 |
а вы сами как думаете? Никак. Если бы у меня были предположения, то я формулировал бы вопрос по-другому.
кому это под силу понять? Я же вроде не нарушаю синтаксиса языка этими ифами… Или нарушаю?..
0 |
YuS_2 Любознательный 4734 / 1116 / 263 Регистрация: 10.03.2016 Сообщений: 2,541 |
||||
05.05.2018, 08:49 |
4 |
|||
Я же вроде не нарушаю синтаксиса языка этими ифами… Или нарушаю? Вы сравнивать пытаетесь букву с цифрой, это раз Если не касаться самого алгоритма игры и с поправками синтаксиса, то, как минимум, должно быть так:
кроме одного места:
0 |
EvilDog17 11 / 11 / 8 Регистрация: 06.01.2018 Сообщений: 134 |
||||
05.05.2018, 11:26 [ТС] |
5 |
|||
YuS_2, я переделал код:
Он всё равно, конечно жк работает не так как я хочу. Можно ли эту программу без goto написать как-то?
0 |
YuS_2 Любознательный 4734 / 1116 / 263 Регистрация: 10.03.2016 Сообщений: 2,541 |
||||
05.05.2018, 16:50 |
6 |
|||
Сообщение было отмечено EvilDog17 как решение РешениеEvilDog17,
конечно жк работает не так как я хочу Вы его как-то странно переделываете… ну, хорошо, вот Вам код, который работает:
Можно ли эту программу без goto написать как-то? Можно, но не в cmd
1 |
EvilDog17 11 / 11 / 8 Регистрация: 06.01.2018 Сообщений: 134 |
||||
05.05.2018, 17:24 [ТС] |
7 |
|||
YuS_2, большое спасибо. Однако, у меня есть пара вопросов по поводу кода.
?
0 |
Любознательный 4734 / 1116 / 263 Регистрация: 10.03.2016 Сообщений: 2,541 |
|
05.05.2018, 18:55 |
8 |
Сообщение было отмечено vavun как решение Решение
1) Как работает
2) Зачем точка после echo перед текстом, который нужно вывести? Просто привычка. Позволяет использовать команду echo с пустой строкой, без вывода доп. сообщений.
3) Что делают строки 11, 12 и 23? Странный вопрос. Обнуляются переменные.
4) Отличается ли чем-то call от goto? Конечно.
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