пакет windows: эхо без новой строки

<p>что такое пакетный эквивалент windows для команды оболочки linux <code>echo -n</code>, которая подавляет символ новой строки в конце вывода?</p><p>идея состоит в том, чтобы писать в одной строке внутри цикла.</p>

<p>используя <code>set</code> и параметр <code>/p</code>, вы можете выводить без новой строки:</p><pre><code>c:\> echo hello world hello world c:\> echo|set /p="hello world" hello world c:\> </code></pre><p> <a href="http://www.devtrends.com/index.php/echo-without-carriage-return-or-line-feed-cr-lf/">источник</a> </p>

<p>использование: <code>echo | set /p=</code> или <code><nul set /p=</code> будет работать для подавления новой строки.</p><p>однако это может быть очень опасно, когда написание более сложных скриптов, когда проверка errorlevel становится важной, так как установка <code>set /p=</code> без указания имени переменной установит для errorlevel значение 1.</p><p>лучшим подходом было бы просто использовать фиктивное имя переменной следующим образом:<br> <code>echo | set /p dummyname=hello world</code> </p><p>это произведет именно то, что вы хотите, без каких-либо подлых вещей, происходящих в фоновом режиме, так как мне пришлось выяснить трудный путь, но это работает только с конвейерной версией; <code><nul set /p dummyname=hello</code> все равно повысит ошибку до 1.</p>

<p>простой метод set/p имеет ограничения, которые немного различаются в разных версиях windows.</p><ul> <li><p>ведущие цитаты могут быть удалены</p></li> <li><p>ведущие пробелы могут быть удалены</p></li> <li><p>ведущий <code>=</code> вызывает синтаксическую ошибку.</p></li> </ul><p>см. <a href="http://www.dostips.com/forum/viewtopic.php?f=3&t=4209">http://www.dostips.com/forum/viewtopic.php?f=3&t=4209</a> для получения дополнительной информации.</p><p>джеб опубликовал умное решение, которое решает большинство проблем в <a href="http://www.dostips.com/forum/viewtopic.php?f=3&t=4213">вывод текста без перевода строки, даже с начальным пробелом или =</a> я усовершенствовал метод, чтобы он мог безопасно печатать абсолютно любую допустимую строку пакета без новой строки, на любая версия windows, начиная с xp. обратите внимание, что метод <code>:writeinitialize</code> содержит строковый литерал, который может плохо размещаться на сайте. включено примечание, описывающее, какой должна быть последовательность символов.</p><p>методы <code>:write</code> и <code>:writevar</code> оптимизированы таким образом, что только строки, содержащие проблемные начальные символы, пишутся с использованием моей модифицированной версии метода jeb copy. беспроблемные строки пишутся с использованием более простого и быстрого метода set/p.</p><pre><code>@echo off setlocal disabledelayedexpansion call :writeinitialize call :write "=hello" call :write " world!%$write.sub%ok!" echo( setlocal enabledelayedexpansion set lf=^ set "str= hello!lf!world^!!!$write.sub!hello!lf!world" echo( echo str=!str! echo( call :write "str=" call :writevar str echo( exit /b :write str :: :: write the literal string str to stdout without a terminating :: carriage return or line feed. enclosing quotes are stripped. :: :: this routine works by calling :writevar :: setlocal disabledelayedexpansion set "str=%~1" call :writevar str exit /b :writevar strvar :: :: writes the value of variable strvar to stdout without a terminating :: carriage return or line feed. :: :: the routine relies on variables defined by :writeinitialize. if the :: variables are not yet defined, then it calls :writeinitialize to :: temporarily define them. performance can be improved by explicitly :: calling :writeinitialize once before the first call to :writevar :: if not defined %~1 exit /b setlocal enabledelayedexpansion if not defined $write.sub call :writeinitialize set $write.special=1 if "!%~1:~0,1!" equ "^!" set "$write.special=" for /f delims^=^ eol^= %%a in ("!%~1:~0,1!") do ( if "%%a" neq "=" if "!$write.problemchars:%%a=!" equ "!$write.problemchars!" set "$write.special=" ) if not defined $write.special ( <nul set /p "=!%~1!" exit /b ) >"%$write.temp%\_1.txt" (echo !str!!$write.sub!) copy "%$write.temp%\_1.txt" /a "%$write.temp%_2.txt" /b >nul type "%$write.temp%\_2.txt" del "%$write.temp%_1.txt" "%$write.temp%\_2.txt" set "str2=!str:*%$write.sub%=%$write.sub%!" if "!str2!" neq "!str!" <nul set /p "=!str2!" exit /b :writeinitialize :: :: defines 3 variables needed by the :write and :writevar routines :: :: $write.temp - specifies a base path for temporary files :: :: $write.sub - contains the sub character, also known as <ctrl-z> or 0x1a :: :: $write.problemchars - list of characters that cause problems for set /p :: <carriagereturn> <formfeed> <space>   <equal> <quote> :: note that <linefeed> and <equal> also causes problems, but are handled elsewhere :: set "$write.temp=%temp%\writetemp%random%" copy nul "%$write.temp%.txt" /a >nul for /f "usebackq" %%a in ("%$write.temp%.txt") do set "$write.sub=%%a" del "%$write.temp%.txt" for /f %%a in ('copy /z "%~f0" nul') do for /f %%b in ('cls') do ( set "$write.problemchars=%%a%%b "" rem the characters after %%b above should be <space>   ) exit /b 

<strong> решение для зачищенного белого пространства в set/p: </strong>хитрость заключается в том символе возврата, который вы можете вызвать в текстовом редакторе edit для dos. чтобы создать его в режиме edit, нажмите ctrlp + ctrlh . я вставил бы его сюда, но эта веб-страница не может его отобразить. хотя он виден в блокноте (он изогнутый, как маленький черный прямоугольник с белым кружком в центре)итак, вы пишете это:<nul set /p=.9 hello everyone точка может быть любым символом, это только там, чтобы сказать set/p, что текст начинается там, перед пробелами, а не в "hello" . "<strong> 9 </strong>" является представление символа возврата, который я не могу отобразить здесь. вы должны поставить его вместо 9, и он удалит "<strong>. </strong>", после чего вы получите следующее: hello everyone вместо:hello everyone я надеюсь, что это помогает

в качестве дополнения к ответу @ xmechanix я заметил, записав содержимое в файл:echo | set /p dummyname=hello world > somefile.txt это добавит<strong> дополнительный пробел в конце напечатанной строки </strong>, что может быть неудобно, особенно потому, что мы пытаемся избежать добавления новой строки (еще один символ пробела) в конец строки.к счастью, цитируем строку, которая будет напечатана, то есть используя:echo | set /p dummyname="hello world" > somefile.txt напечатает строку без символа перевода строки или пробела в конце.

вы можете удалить новую строку, используя "tr" из gnuwin32 ( <a href="http://gnuwin32.sourceforge.net/packages/coreutils.htm">coreutils package)@echo off set l=first line echo %l% | tr -d "rn" echo second line pause кстати, если вы делаете много сценариев, gnuwin32 - это золотая жила.

вот еще один метод, он использует powershell write-host, который имеет параметр -nonewline, объединяет его с start /b и предлагает те же функциональные возможности из пакета.nonewlines.cmd@echo off start /b /wait powershell.exe -command "write-host -nonewline 'result 1 - ';write-host -nonewline 'result 2 - ';write-host -nonewline 'result 3 - '" pause результатresult 1 - result 2 - result 3 - press any key to continue . . . этот ниже немного отличается, не работает точно так, как хочет op, но интересен, потому что каждый результат перезаписывает предыдущий результат, эмулирующий счетчик.@echo off start /b /wait powershell.exe -command "write-host -nonewline 'result 1 - '" start /b /wait powershell.exe -command "write-host -nonewline 'result 2 - '" start /b /wait powershell.exe -command "write-host -nonewline 'result 3 - '" start /b /wait powershell.exe -command "write-host -nonewline 'result 4 - '" start /b /wait powershell.exe -command "write-host -nonewline 'result 5 - '" start /b /wait powershell.exe -command "write-host -nonewline 'result 6 - '" start /b /wait powershell.exe -command "write-host -nonewline 'result 7 - '" start /b /wait powershell.exe -command "write-host -nonewline 'result 8 - '" start /b /wait powershell.exe -command "write-host -nonewline 'result 9 - '" pause 

<blockquote> с <a href="https://stackoverflow.com/questions/7105433/windows-batch-echo-without-new-line#comment8520146_7105690">здесь  </blockquote><nul set /p =testing testing а также повторить, начиная с использования пробеловecho.message goes here 

diy cw.exe (консольная запись) утилитаесли вы не найдете его готовым, готовым, вы можете сделать это самостоятельно. с помощью этой утилиты cw вы можете использовать любые символы. по крайней мере, мне бы так хотелось. пожалуйста, стресс-тест и дайте мне знать.инструментывсе, что вам нужно, это <a href="https://www.microsoft.com/net/download/windows">.net установлен, что очень распространено в наши дни.материалынекоторые символы напечатаны/скопированы.меры создайте файл .bat со следующим содержимым. / >nul 2>&1 @echo off setlocal set exe=cw for /f "tokens= delims=" %%v in ('dir /b /s /a:-d /o:-n "%systemroot%microsoft.netframeworkcsc.exe"') do set "csc=%%v" "%csc%" -nologo -out:"%exe%.exe" "%~f0" endlocal exit /b %errorlevel% / using system; namespace cw { class program { static void main() { var exe = environment.getcommandlineargs()[0]; var rawcmd = environment.commandline; var line = rawcmd.remove(rawcmd.indexof(exe),exe.length).trimstart('"'); line = line.length < 2 ? "r" : line.substring(2) ; console.write(line); } } } <ol start="2"> запустить его. теперь у вас есть служебная программа nice 4kb, поэтому вы можете удалить .bat. кроме того, вы можете вставить этот код в качестве подпрограммы в любой пакет, отправить полученный .exe в %temp%, использовать его в вашем пакете и удалить его, когда вы закончите.как пользоватьсяесли вы хотите написать что-то без новой строки: cw whatever you want, even with "", but remember to escape ^|, ^^, ^&, etc. unless double-quoted, like in "| ^ &".если вы хотите возврат каретки (переход к началу строки), просто запустите cwтак что попробуйте это из командной строки:for /l %a in (1,1,1000) do @(cw ^|&cw&cw /&cw&cw -&cw&cw &cw) 

может быть, это то, что вы ищете, это сценарий старой школы ...: pset nl=^& echo. echo %nl%the%nl%new%nl%line%nl%is%nl%not%nl%apparent%nl%throughout%nl%text%nl% echo only in prompt. pause или, может быть, вы пытаетесь заменить текущую строку вместо записи в новую строку? вы можете поэкспериментировать с этим, удалив «% bs%» после «.» подписать, а также через интервал других "% bs%" после "пример сообщения".for /f %%a in ('"prompt $h&for %%b in (1) do rem"') do set "bs=%%a" <nul set /p=.%bs% example message %bs% pause </code></pre><p>я нахожу это действительно интересным, потому что он использует переменную не для той цели, для которой он предназначен. как вы можете видеть, "% bs%" представляет собой забой. второй «% bs%» использует пробел для добавления пробелов после «пример сообщения» для разделения «вывод команды пауза» без фактического добавления видимого символа после «пример сообщения». однако это также возможно с обычным знаком процента. </p>

<p>пример 1: это работает и производит код выхода = 0. это хорошо. обратите внимание "." сразу после эха.</p><blockquote> <p>c:\users\phife.dog\gitrepos\1\repo\_abc\scripts #<br> @echo. | set/p junk\_var = это сообщение отображается как linux echo -n отобразит его ... & echo% errorlevel%</p> </blockquote><p>это сообщение отображается как linux echo -n будет отображать его ... 0</p><p>пример 2: это работает<em> но </em>создает код выхода = 1. это плохо. обратите внимание на отсутствие «.» после эха. похоже, что это разница.</p><blockquote> <p>c:\users\phife.dog\gitrepos\1\repo\_abc\scripts #<br> @echo | set/p junk\_var = это сообщение отображается как linux echo -n отобразит его ... & echo% errorlevel%</p> </blockquote><p>это сообщение отображается как linux echo -n будет отображать его ... 1 </p>

<p>поздний ответ здесь, но для тех, кому нужно написать специальные символы в одной строке, для которых ответ <a href="https://stackoverflow.com/users/1012053/">dbenham</a> слишком длинный, примерно на 80 строк и чьи сценарии могут ломаться (возможно, из-за ввода данных пользователем) из-за ограничений просто используя <code>set /p</code>, возможно, проще всего просто соединить ваш .bat или .cmd с скомпилированным исполняемым файлом на языке c++ или c, а затем просто <code>cout</code> или <code>printf</code> символы. это также позволит вам легко писать несколько раз в одну строку, если вы показываете какой-то индикатор выполнения или что-то с использованием символов, как, очевидно, было в op.</p>

<p>я считаю, что нет такой возможности. или вы можете попробовать это</p><pre><code>set text=hello set text=%text% world echo %text% </code></pre>

<p>вы можете подавить новую строку, используя команду set/p. команда set/p не распознает пробел, для этого вы можете использовать точку и символ возврата, чтобы она его распознала. вы также можете использовать переменную в качестве памяти и сохранить в ней то, что вы хотите напечатать, чтобы вы могли напечатать переменную вместо предложения. например:</p><pre><code>@echo off setlocal enabledelayedexpansion for /f %%a in ('"prompt $h & for %%b in (1) do rem"') do (set "bs=%%a") cls set "var=hello world! :)" set "x=0" :loop set "display=!var:~%x%,1!" <nul set /p "print=.%bs%%display%" ping -n 1 localhost >nul set /a "x=%x% + 1" if "!var:~%x%,1!" == "" goto end goto loop :end echo. pause exit </code></pre><p>таким образом, вы можете напечатать что-нибудь без новой строки. я сделал программу для печати символов один за другим, но вы также можете использовать слова вместо символов, изменив цикл.</p><p>в приведенном выше примере я использовал «enabledelayedexpansion», поэтому команда set/p не распознает «!» символ и печатает точку вместо этого. я надеюсь, что вы не используете восклицательный знак "!" ;)</p>

<p>я сделал функцию из идеи @arnep: </p><blockquote> <p>echo | set/p = "hello world" </p> </blockquote><p><strong> вот: </strong></p><pre><code>:sl (sameline) echo|set /p=%1 exit /b </code></pre><p>используйте его с <code>call :sl "hello there"</code> <br> я знаю, что в этом нет ничего особенного, но мне потребовалось так много времени, чтобы подумать об этом, и я решил опубликовать это здесь.</p>