Что такое пакетный эквивалент Windows для команды оболочки Linux, echo -n
которая подавляет символ новой строки в конце вывода?
Идея состоит в том, чтобы писать в одной строке внутри цикла.
windows
batch-file
cmd
newline
gregseth
источник
источник
echo
может взять,-n
ноcmd.exe
это просто не сработает ^^echo
мог взять-n
» в контексте вопроса, связанного с Windows, является неправильным.Ответы:
Используя
set
и/p
параметр, вы можете отображать без новой строки:Источник
источник
<nul set /p =Hello
.set /p
не может отображать знак равенства как первый символ, так и пробелы / символы табуляции.< nul
- это перенаправление сNUL
устройства. Он не содержит ничего, но этого достаточно,set /p
чтобы перестать ждать ввода пользователяИспользование:
echo | set /p=
или<NUL set /p=
оба будут работать для подавления новой строки.Однако это может быть очень опасно, когда написание более сложных сценариев, когда проверка ERRORLEVEL становится важной, так как установка
set /p=
без указания имени переменной установит для ERRORLEVEL значение 1.Лучшим подходом было бы просто использовать фиктивное имя переменной следующим образом:
echo | set /p dummyName=Hello World
Это произведет именно то, что вы хотите, без каких-либо подлых вещей, происходящих в фоновом режиме, так как мне пришлось выяснить трудный путь, но это работает только с конвейерной версией;
<NUL set /p dummyName=Hello
все равно поднимет ОШИБКУ до 1.источник
Простой метод SET / P имеет ограничения, которые немного различаются в разных версиях Windows.
Ведущие цитаты могут быть удалены
Ведущие пробелы могут быть удалены
Ведущий
=
вызывает синтаксическую ошибку.См. Http://www.dostips.com/forum/viewtopic.php?f=3&t=4209 для получения дополнительной информации.
Джеб опубликовал умное решение, которое решает большинство проблем в тексте вывода без перевода строки, даже с начальным пробелом или = я усовершенствовал метод, чтобы он мог безопасно печатать абсолютно любую допустимую строку пакета без новой строки в любой версии Windows от XP и далее. Обратите внимание, что
:writeInitialize
метод содержит строковый литерал, который может плохо размещаться на сайте. Включено примечание, описывающее, какой должна быть последовательность символов.:write
И:writeVar
методы оптимизированы таким образом, что только строки , содержащие хлопотно ведущие символы записываются с помощью моей модифицированной версии метода COPY Джеба. Беспроблемные строки пишутся с использованием более простого и быстрого метода SET / P.источник
ECHO.
, за исключением,ECHO.
может потерпеть неудачу при неизвестных обстоятельствах . Есть множество других форм, которые также могут потерпеть неудачу в непонятных ситуациях. Единственное, что всегда работает, этоECHO(
.В качестве дополнения к ответу @ xmechanix я заметил, записав содержимое в файл:
Это добавит дополнительный пробел в конце напечатанной строки , что может быть неудобно, особенно если учесть, что мы пытаемся избежать добавления новой строки (другого символа пробела) в конец строки.
К счастью, цитирование строки для печати, то есть с помощью:
Напечатает строку без символа перевода строки или пробела в конце.
источник
World
и>
...set /p="abc"<nul|xxd -p
отображает,616263
тогда какset /p=abc<nul|xxd -p
дает61626320
Решение для очищенного белого пространства в SET / P:
хитрость заключается в том символе возврата, который вы можете вызвать в текстовом редакторе EDIT для DOS. Чтобы создать его в режиме EDIT, нажмите Ctrl + CtrlH . Я вставил бы это здесь, но эта веб-страница не может отобразить это. Хотя он виден в блокноте (он странный, как маленький черный прямоугольник с белым кружком в центре)
Итак, вы пишете это:
Точка может быть любым символом, это только там, чтобы сказать SET / P, что текст начинается там, перед пробелами, а не в " Hello ». « 9 » - это представление символа возврата, которое я не могу отобразить здесь. Вы должны поставить его вместо 9, и он удалит « . », После чего вы получите это:
вместо того:
Я надеюсь, что это помогает
источник
Вы можете удалить новую строку, используя "tr" из gnuwin32 ( пакет coreutils )
Кстати, если вы делаете много сценариев, gnuwin32 - это золотая жила.
источник
trim
?\r
,\n
или\r\n
(новые строки в OSX, Posix и Windows , соответственно) не являются «космическими» символами.Вот еще один метод, он использует Powershell Write-Host, у которого есть параметр -NoNewLine, объедините его с
start /b
и предлагает те же функциональные возможности из пакета.NoNewLines.cmd
Вывод
Это ниже немного отличается, не работает точно так, как хочет OP, но интересно, потому что каждый результат перезаписывает предыдущий результат, эмулирующий счетчик.
источник
а также повторить, начиная с использования пробелов
источник
Может быть, это то, что вы ищете, это сценарий старой школы ...: P
или, может быть, вы пытаетесь заменить текущую строку вместо записи в новую строку? Вы можете поэкспериментировать с этим, удалив «% bs%» после «.» знак, а также через интервал между "% bs%" после "Пример сообщения".
Я нахожу это действительно интересным, потому что он использует переменную не для той цели, для которой он предназначен. как вы можете видеть, "% bs%" представляет собой забой. Второй «% bs%» использует пробел для добавления пробелов после «Пример сообщения» для разделения «Вывод команды Пауза» без фактического добавления видимого символа после «Пример сообщения». Однако это также возможно с обычным знаком процента.
источник
set nl=^& echo.
трюк везде, и имя переменной вводит в заблуждение. % п% есть не новой строки символов : она расширяется&echo.
так , в конце концов вы работаете новуюecho
команду каждый раз, следовательно , символ новой строки. Вы можете проверить это в письменной формеecho "%nl%The%nl%new%nl%line%nl%is%nl%not%nl%apparent%nl%throughout%nl%text%nl%"
. Вы получаете"& echo. The& echo. new& echo. line& echo. is& echo. not& echo. apparent& echo. throughout& echo. text& echo. "
, раскрывая трюк. Вывод такой же, но не по тем причинам, которые вы предлагаете.DIY
cw.exe
(консольная запись) утилитаЕсли вы не найдете его готовым, готовым, вы можете сделать это самостоятельно. С этим
cw
утилиты вы можете использовать любые символы. По крайней мере, мне бы хотелось так думать. Пожалуйста, стресс-тест и дайте мне знать.инструменты
Все, что вам нужно, это установить .NET , что очень распространено в наши дни.
материалы
Некоторые символы напечатаны / скопированы.
меры
.bat
файл со следующим содержанием.Запустить его.
Теперь у вас есть хорошая утилита 4KB, поэтому вы можете удалить
.bat
.Кроме того , вы можете вставить этот код в качестве подпрограммы в любой партии, отправить в результате
.exe
к%temp%
, использовать его в своей партии и удалить его , когда вы закончите.Как пользоваться
Если вы хотите написать что-то без новой строки:
cw Whatever you want, even with "", but remember to escape ^|, ^^, ^&, etc. unless double-quoted, like in "| ^ &".
Если вы хотите возврат каретки (переход к началу строки), просто запустите
cw
Так что попробуйте это из командной строки:
источник
Я сделал функцию из идеи @arnep:
вот:
Используйте это с,
call :SL "Hello There"
я знаю, что в этом нет ничего особенного, но я так долго думал об этом, что я решил опубликовать это здесь.
источник
Пример 1: Это работает и производит код выхода = 0. Это хорошо. Обратите внимание "." сразу после эха.
Это сообщение отображается как Linux echo -n будет отображать его ... 0
Пример 2: это работает, но выдает код выхода = 1. Это плохо. Обратите внимание на отсутствие "." После эха. Похоже, что это разница.
Это сообщение отображается как Linux эхо -n будет отображать его ... 1
источник
Вдохновленный ответами на этот вопрос, я сделал простой пакетный скрипт счетчика, который продолжает печатать значение прогресса (0-100%) в той же строке (перезаписывая предыдущий). Возможно, это также будет полезно для других, ищущих подобное решение.
Примечание :
*
это непечатаемые символы, их следует вводить с помощью комбинации клавиш [Alt
+Numpad 0
+Numpad 8
], которая являетсяbackspace
символом.источник
Я считаю, что нет такой возможности. Или вы можете попробовать это
источник
Вы можете подавить новую строку, используя команду set / p. Команда set / p не распознает пробел, для этого вы можете использовать точку и символ возврата, чтобы она его распознала. Вы также можете использовать переменную в качестве памяти и сохранить то, что вы хотите напечатать в ней, чтобы вы могли напечатать переменную вместо предложения. Например:
Таким образом, вы можете напечатать что-нибудь без новой строки. Я сделал программу для печати символов один за другим, но вы также можете использовать слова вместо символов, изменив цикл.
В приведенном выше примере я использовал «enabledelayedexpansion», поэтому команда set / p не распознает «!» символ и печатает точку вместо этого. Я надеюсь, что вы не используете восклицательный знак "!" ;)
источник
Поздний ответ здесь, но для тех, кому нужно написать специальные символы в одной строке, для которых ответ dbenham слишком длинный, примерно на 80 строк и чьи сценарии могут ломаться (возможно, из-за ввода данных пользователем) из-за ограничений простого использования
set /p
, вероятно, проще всего связать ваш .bat или .cmd с скомпилированным исполняемым файлом на C ++ или языке C, а затем простоcout
илиprintf
с символами. Это также позволит вам легко писать несколько раз в одну строку, если вы показываете какой-то индикатор выполнения или что-то с использованием символов, как, очевидно, было в OP.источник
printf
сcmd
панели Win-7 дает мне"'printf' is not recognized as an internal or external command, operable program or batch file."
printf
не является родным для Windows. Это вопрос Windows.