Windows Batch: Echo ohne neue Zeile

231

Was ist das Windows-Batch-Äquivalent zum Linux-Shell-Befehl, echo -nder den Zeilenumbruch am Ende der Ausgabe unterdrückt?

Die Idee ist, innerhalb einer Schleife in dieselbe Zeile zu schreiben.

gregseth
quelle
2
Das hat mich fast verrückt gemacht. Ich wusste, dass ich es aushalten echokönnte, -naber cmd.exees würde einfach nicht funktionieren ^^
Panny
11
@panny - Trotz des gebräuchlichen Namens ist echo nicht der gleiche Befehl zwischen Windows und Posix. Wie nslookup gibt es verschiedene Optionen. Daher ist der Kommentar "Ich wusste, dass ich echonehmen könnte -n" im Zusammenhang mit einer Frage zu Windows falsch.
user66001

Antworten:

236

Mit setund dem /pParameter können Sie ohne Zeilenumbruch wiedergeben:

C:\> echo Hello World
Hello World

C:\> echo|set /p="Hello World"
Hello World
C:\>

Quelle

Arnep
quelle
86
Die Pipe ist sehr langsam, da sie zwei zusätzliche Cmd-Aufgaben erstellt, schneller ist <nul set /p =Hello. set /pkann kein Gleichheitszeichen als erstes Zeichen oder Leerzeichen / Tabulatoren wiedergeben.
Jeb
11
Es ist fast 15 mal schneller auf meinem System
jeb
28
Fügen Sie Anführungszeichen um "Hello World" hinzu, um zu verhindern, dass nach dem d Leerzeichen entstehen.
Brian
13
Warnung: Dadurch wird ERRORLEVEL auf 1 geändert. Siehe Antwort von @xmechanix.
CoperNick
6
@ user246694 < nulist eine Umleitung vom NULGerät. Es enthält nichts, aber das ist genug set /p, um nicht mehr auf Benutzereingaben zu warten
jeb
100

Verwenden von: echo | set /p=oder <NUL set /p=funktionieren beide, um die neue Zeile zu unterdrücken.

Dies kann jedoch sehr gefährlich sein, wenn beim Überprüfen des ERRORLEVEL erweiterte Skripte geschrieben werden, da die Einstellung set /p=ohne Angabe eines Variablennamens den ERRORLEVEL auf 1 setzt.

Ein besserer Ansatz wäre, einfach einen Dummy-Variablennamen wie folgt zu verwenden:
echo | set /p dummyName=Hello World

Dies wird genau das produzieren, was Sie wollen, ohne dass im Hintergrund hinterhältige Dinge vor sich gehen, da ich es auf die harte Tour herausfinden musste, aber dies funktioniert nur mit der Piped-Version. <NUL set /p dummyName=Helloerhöht weiterhin den FEHLER auf 1.

xmechanix
quelle
20
Warnung: Mit diesem Befehl wird ERRORLEVEL auf 0 gesetzt. Wenn ERRORLEVEL größer als 0 war, wird ERRORLEVEL auf 0 geändert. Dies kann auch beim Schreiben erweiterter Skripte gefährlich sein. (aber +1 für die Antwort)
CoperNick
Sie benötigen also grundsätzlich ein IF ERRORLEVEL == 0 (...) ELSE (...), um Ihre Umgebung unter diesen Umständen nicht zu schädigen. Meine Güte.
SilverbackNet
28

Die einfache SET / P-Methode weist Einschränkungen auf, die zwischen den Windows-Versionen geringfügig variieren.

  • Führende Anführungszeichen können entfernt werden

  • Führender Leerraum kann entfernt werden

  • Führen =führt zu einem Syntaxfehler.

Weitere Informationen finden Sie unter http://www.dostips.com/forum/viewtopic.php?f=3&t=4209 .

jeb hat eine clevere Lösung veröffentlicht, die die meisten Probleme bei der Ausgabe von Text ohne Zeilenvorschub löst , selbst mit führendem Leerzeichen oder = Ich habe die Methode so verfeinert, dass absolut jede gültige Stapelzeichenfolge ohne die neue Zeile unter jeder Windows-Version sicher gedruckt werden kann ab XP. Beachten Sie, dass die :writeInitializeMethode ein Zeichenfolgenliteral enthält, das möglicherweise nicht gut auf der Site veröffentlicht wird. Es ist eine Bemerkung enthalten, die beschreibt, wie die Zeichenfolge aussehen soll.

Die Methoden :writeund :writeVarsind so optimiert, dass nur Zeichenfolgen mit störenden Hauptzeichen mit meiner modifizierten Version der COPY-Methode von jeb geschrieben werden. Nicht störende Zeichenfolgen werden mit der einfacheren und schnelleren SET / P-Methode geschrieben.

@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> <tab> <0xFF> <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> <tab> <0xFF>
)
exit /b
Dbenham
quelle
1
Schön, eine sehr mächtige Lösung zu sehen, die mit allen Charakteren umgehen kann
jeb
2
Ich möchte darauf hinweisen, dass, wenn der Computer eine Netzwerkverbindung zum Internet hat, ungefähr so ​​viel Batch-Code zum Herunterladen und Installieren von Python oder anderen Elementen auf dem Computer verwendet werden kann, mit denen Sie Batch loswerden können. Batch macht Spaß, aber seine Saitenfähigkeiten eignen sich am besten für die Herausforderung am Wochenende.
n611x007
@dbenham in Zeile 6 "Echo (" ist funktional das gleiche wie "Echo". - noch nie gesehen.
Skip R
2
@SkipR - Ja, es ist funktional dasselbe wie ECHO., außer ECHO.dass es unter dunklen Umständen fehlschlagen kann . Es gibt eine Reihe anderer Formen, die auch in dunklen Situationen fehlschlagen können. Der einzige, der immer funktioniert, ist ECHO(.
Dbenham
10

Als Ergänzung zur Antwort von @ xmechanix bemerkte ich beim Schreiben des Inhalts in eine Datei:

echo | set /p dummyName=Hello World > somefile.txt

Dies fügt am Ende der gedruckten Zeichenfolge ein zusätzliches Leerzeichen hinzu , was unpraktisch sein kann, insbesondere da wir versuchen, das Hinzufügen einer neuen Zeile (eines weiteren Leerzeichens) am Ende der Zeichenfolge zu vermeiden.

Glücklicherweise zitieren Sie die zu druckende Zeichenfolge, dh verwenden Sie:

echo | set /p dummyName="Hello World" > somefile.txt

Druckt die Zeichenfolge am Ende ohne Zeilenumbruch oder Leerzeichen.

Joan Bruguera
quelle
5
Das zusätzliche Leerzeichen sollte verschwinden, wenn Sie kein Leerzeichen zwischen Worldund >...
aschipfl
@aschipfl Versucht es, es nicht.
Joan Bruguera
Die Methode der zitierten Variablen, eine undokumentierte Funktion des Befehls set, ist meines Erachtens im Allgemeinen die Vorgehensweise, da sie in allen Versionen von Windows NT (und 9x, wenn ich mich recht erinnere) funktioniert. Das heißt, Sie setzen den Variablennamen in Anführungszeichen an das Ende des Werts. Dies gilt auch für Set / P.
Ben Personick
1
IE: echo | set / p "dummyName = Hallo Welt"> somefile.txt
Ben Personick
2
@aschipfl Ein zusätzliches Leerzeichen wird angezeigt, wenn Sie keine Anführungszeichen setzen und eine Pipe erstellen. xxd ist ein Hex-Dump-Dienstprogramm, also sehen wir zB set /p="abc"<nul|xxd -pAnzeigen, 616263 während es set /p=abc<nul|xxd -pgibt61626320
barlop
9

Eine Lösung für den gestrippten Leerraum in SET / P:

Der Trick ist das Backspace-Zeichen, das Sie im Texteditor EDIT for DOS aufrufen können . Um es in EDIT zu erstellen, drücken Sie Strg + Strg . Ich würde es hier einfügen, aber diese Webseite kann es nicht anzeigen. Es ist jedoch auf dem Editor sichtbar (es ist wie ein kleines schwarzes Rechteck mit einem weißen Kreis in der Mitte).

Also schreibst du das:

<nul set /p=.9    Hello everyone

Der Punkt kann ein beliebiges Zeichen sein. Er dient nur dazu, SET / P mitzuteilen, dass der Text dort vor den Leerzeichen beginnt und nicht beim " Hallo ". Die " 9 " ist eine Darstellung des Backspace-Zeichens, das ich hier nicht anzeigen kann. Sie müssen es anstelle der 9 setzen, und es löscht das " . ", Danach erhalten Sie Folgendes:

    Hello Everyone

anstatt:

Hello Everyone

Ich hoffe, es hilft

Pedro
quelle
2
Ich habe vergessen zu sagen, es funktioniert in Windows 7 Es funktioniert nicht in einer Befehlszeile, nur in einem Stapel. Für alle, die das Zeichen
Pedro
Gilt auch für Echo
Ben Personick
... Also, nach einer verdammt gründlichen Suche habe ich das nirgendwo im Netz gefunden. Es könnte das einzige Mal sein, dass ich tatsächlich etwas entdeckt habe, und zwar durch dummes Glück. Für diejenigen, die nicht wissen, dass Sie Steuerzeichen eingeben können, wenn Sie Ihre cmd-Eingabeaufforderung in den Legacy-Modus versetzen und die richtige Schriftart verwenden. ... Aber wenn Sie einfach etwas in eine Datei umleiten oder> con, funktioniert es auch. Ernsthaft. Fügen Sie dies GENAU in Ihre Eingabeaufforderung ein: "echo ← c◙◙ ○○ Harharhar !! ◙ ○○ ------------- ◙◙ ○○ Ich bin der Schlimmste!?: '(○ ♪ ○ NOPE! • ♪ ○ Ich fühle mich großartig! Hazzah-le-oop! ◙◙ ○ Ich bin Programmierer, höre mich ... etwas.◙> con ".
Brent Rittenhouse
Okay, ich hoffe, ich habe das vor allen anderen herausgefunden, aber ... das hängt anscheinend davon ab, dass ich nicht auf einer Unicode-Codepage bin. Sie können den Start in einer Variablen do chcp 437 speichern, den Satz in eine Variable setzen oder ihn ausgeben und dann zurückschalten (und er sollte immer noch ausgegeben werden). Ich spiele immer noch damit herum.
Brent Rittenhouse
Hat jemand eine Idee, warum ← c den Bildschirm löscht?! Ich kann nirgendwo im Internet eine Instanz davon finden. Es ist speziell diese Kombination, obwohl Sie anscheinend auch Leerzeichen zwischen den beiden Zeichen haben können. Für jedes andere Zeichen scheint es nur .. das erste Zeichen zu entfernen. Ich verstehe es nicht ...
Brent Rittenhouse
7

Sie können die Newline mit "tr" aus gnuwin32 ( coreutils- Paket) entfernen.

@echo off
set L=First line
echo %L% | tr -d "\r\n"
echo Second line
pause

Übrigens, wenn Sie viel schreiben, ist gnuwin32 eine Goldmine.

BearCode
quelle
Ich schlage auch vor, Git Bash zu installieren . Sicher ist es nicht dasselbe wie gnuwin32 (und es ist eine Goldmine, also +1), es ist nur ein schönes Setup, und Sie haben fast überall Git-Bash auf der rechten Maustaste, einschließlich der Startmenü-Taste.
hakre
Kannst du tr verwenden, um nur das letzte Leerzeichen zu entfernen, wie in trim?
Panny
benutze sed zum Trimmen: sed -e "s / * $ //"
BearCode
@panny - Ich kann kein Posix / Linux-Util namens trim finden. Auch \r, \noder \r\n(neue Linien in OSX, Posix und Windows bezeichnet) sind nicht „Raum“ Zeichen.
user66001
5

Hier ist eine andere Methode, sie verwendet Powershell Write-Host, der einen -NoNewLine-Parameter hat, kombiniert diesen mit start /bund bietet die gleiche Funktionalität aus dem Batch.

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

Ausgabe

Result 1 - Result 2 - Result 3 - Press any key to continue . . .

Das folgende ist etwas anders, funktioniert nicht genau so, wie es das OP will, ist aber interessant, da jedes Ergebnis das vorherige Ergebnis überschreibt, das einen Zähler emuliert.

@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
Knöchel-Dragger
quelle
3

Von hier aus

<nul set /p =Testing testing

und auch beginnend mit Leerzeichen zu wiederholen

echo.Message goes here
Afdsafnadsjbcewjhwnfy4ntc874fg
quelle
2

Vielleicht ist es das, wonach du suchst, es ist ein Drehbuch der alten Schule ...: P.

set 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

oder versuchen Sie vielleicht, eine aktuelle Zeile zu ersetzen, anstatt in eine neue Zeile zu schreiben? Sie können damit experimentieren, indem Sie "% bs%" nach "." Zeichen und auch durch Abstand der anderen "% bs%" nach der "Beispielnachricht".

for /f %%a in ('"prompt $H&for %%b in (1) do rem"') do set "bs=%%a"
<nul set /p=.%bs%         Example message         %bs%
pause

Ich finde das wirklich interessant, weil es eine Variable für einen anderen Zweck als den vorgesehenen verwendet. Wie Sie sehen können, steht "% bs%" für eine Rücktaste. Das zweite "% bs%" verwendet die Rücktaste, um Leerzeichen nach der "Beispielnachricht" hinzuzufügen, um die Ausgabe des "Pausenbefehls" zu trennen, ohne tatsächlich ein sichtbares Zeichen nach der "Beispielnachricht" hinzuzufügen. Dies ist jedoch auch mit einem regulären Prozentzeichen möglich.

zask
quelle
2
Ich sehe diesen set nl=^& echo.Trick überall und der Name der Variablen ist irreführend. % nl% betragen nicht ein Newline - Zeichen : es erweitert zu &echo.laufen so am Ende wird man einen neuen echojedes Mal Befehl, damit die Newline. Sie können es schriftlich überprüfen echo "%nl%The%nl%new%nl%line%nl%is%nl%not%nl%apparent%nl%throughout%nl%text%nl%". Sie bekommen "& echo. The& echo. new& echo. line& echo. is& echo. not& echo. apparent& echo. throughout& echo. text& echo. ", den Trick zu enthüllen. Die Ausgabe ist dieselbe, jedoch nicht aus den von Ihnen vorgeschlagenen Gründen.
cdlvcdlv
2

DIY- cw.exeDienstprogramm (Konsolenschreiben)

Wenn Sie es nicht sofort finden, können Sie selbst basteln. Mit diesem cwDienstprogramm können Sie alle Arten von Zeichen verwenden. Zumindest würde ich das gerne glauben. Bitte testen Sie es und lassen Sie es mich wissen.

Werkzeuge

Alles, was Sie brauchen, ist .NET installiert, was heutzutage sehr verbreitet ist.

Materialien

Einige Zeichen eingegeben / kopiert.

Schritte

  1. Erstellen Sie eine .batDatei mit dem folgenden Inhalt.
/* >nul 2>&1

@echo off
setlocal

set exe=cw
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*csc.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);
        }
    }
}
  1. Starte es.

  2. Jetzt haben Sie ein nettes 4KB-Dienstprogramm, mit dem Sie das löschen können .bat.

Alternativ können Sie diesen Code als Unterprogramm in einen beliebigen Stapel einfügen, das Ergebnis .exean senden %temp%, ihn in Ihrem Stapel verwenden und ihn löschen, wenn Sie fertig sind.

Wie benutzt man

Wenn Sie etwas ohne neue Zeile schreiben möchten:
cw Whatever you want, even with "", but remember to escape ^|, ^^, ^&, etc. unless double-quoted, like in "| ^ &".

Wenn Sie einen Wagenrücklauf wünschen (bis zum Zeilenanfang), führen Sie einfach aus
cw

Versuchen Sie dies über die Befehlszeile:

for /l %a in (1,1,1000) do @(cw ^|&cw&cw /&cw&cw -&cw&cw \&cw)
cdlvcdlv
quelle
Ich habe mich von Ihrer Antwort inspirieren lassen und dieses kleine Tool mit Go und dieser zugehörigen Aufgabe für Azure Pipelines erstellt. Es greift nur das eingespeiste stdout auf und gibt es in einem bestimmten Format aus, das vom Build übernommen werden soll. Danke dir!
Riezebosch
2

Ich habe aus @arneps Idee eine Funktion gemacht:

echo | set / p = "Hallo Welt"

hier ist es:

:SL (sameline)
echo|set /p=%1
exit /b

Verwenden Sie es mit call :SL "Hello There"
Ich weiß, dass dies nichts Besonderes ist, aber ich habe so lange gebraucht, um darüber nachzudenken, dass ich dachte, ich würde es hier posten.

Mark Deven
quelle
1

Beispiel 1: Dies funktioniert und erzeugt Exit-Code = 0. Das ist gut. Beachten Sie das "." direkt nach dem Echo.

C: \ Users \ phife.dog \ gitrepos \ 1 \ repo_abc \ scripts #
@echo. | set / p JUNK_VAR = Dies ist eine Meldung, die so angezeigt wird, als würde Linux echo -n sie anzeigen ... & echo% ERRORLEVEL%

Dies ist eine Meldung, die so angezeigt wird, als würde Linux echo -n sie anzeigen ... 0

Beispiel 2: Dies funktioniert , erzeugt jedoch den Exit-Code = 1. Das ist schlecht. Bitte beachten Sie das Fehlen von "." Nach dem Echo. Das scheint der Unterschied zu sein.

C: \ Users \ phife.dog \ gitrepos \ 1 \ repo_abc \ scripts #
@echo | set / p JUNK_VAR = Dies ist eine Meldung, die so angezeigt wird, als würde Linux echo -n sie anzeigen ... & echo% ERRORLEVEL%

Dies ist eine Meldung, die so angezeigt wird, als würde Linux echo -n sie anzeigen ... 1

user3175529
quelle
1

Inspiriert von den Antworten auf diese Frage habe ich ein einfaches Counter-Batch-Skript erstellt, das den Fortschrittswert (0-100%) in derselben Zeile druckt (wobei der vorherige überschrieben wird). Vielleicht ist dies auch für andere wertvoll, die nach einer ähnlichen Lösung suchen.

Anmerkung : Es *handelt sich um nicht druckbare Zeichen. Diese sollten mit der Tastenkombination [ Alt+ Numpad 0+ Numpad 8] eingegeben werden. Dies ist das backspaceZeichen.

@ECHO OFF

FOR /L %%A in (0, 10, 100) DO (     
    ECHO|SET /P="****%%A%%"    
    CALL:Wait 1
)

GOTO:EOF

:Wait
SET /A "delay=%~1+1"
CALL PING 127.0.0.1 -n %delay% > NUL
GOTO:EOF
Spinicoffee
quelle
0

Ich glaube, es gibt keine solche Option. Alternativ können Sie dies versuchen

set text=Hello
set text=%text% world
echo %text%
m0skit0
quelle
3
Dadurch wird weiterhin eine neue Zeile gedruckt.
René Nyffenegger
3
Sie können dieselbe Variable so oft verketten, wie Sie möchten, und nur ganz am Ende widerhallen.
m0skit0
2
Das Drucken während der Schleife oder am Ende spielt keine Rolle, ob die Daten erhalten bleiben. Für jede Schleife verketten Sie einfach die Daten, und wenn die Schleife beendet ist, drucken Sie sie aus. Das Ergebnis ist das gleiche.
m0skit0
9
Es spielt keine Rolle, ob es ein Indikator für den Verlauf der Schleife ist.
Gregseth
3
Sie haben dies in Ihrer Frage nie angegeben oder dieses Verhalten irgendwo in Ihrer Frage angefordert.
m0skit0
0

Sie können die neue Zeile mit dem Befehl set / p unterdrücken. Der Befehl set / p erkennt kein Leerzeichen. Dazu können Sie einen Punkt und ein Rücktastezeichen verwenden, damit es erkannt wird. Sie können eine Variable auch als Speicher verwenden und darin speichern, was Sie drucken möchten, sodass Sie die Variable anstelle des Satzes drucken können. Beispielsweise:

@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

Auf diese Weise können Sie alles ohne neue Zeile drucken. Ich habe das Programm erstellt, um die Zeichen einzeln zu drucken, aber Sie können auch Wörter anstelle von Zeichen verwenden, indem Sie die Schleife ändern.

Im obigen Beispiel habe ich "enabledelayedexpansion" verwendet, damit der Befehl set / p "!" Nicht erkennt. Zeichen und druckt stattdessen einen Punkt. Ich hoffe, dass Sie nicht das Ausrufezeichen "!" ;)

JVRaghava rama Sharma
quelle
-1

Späte Antwort hier, aber für alle, die Sonderzeichen in eine einzelne Zeile schreiben müssen , die die Antwort von dbenham als etwa 80 Zeilen zu lang empfinden und deren Skripte (möglicherweise aufgrund von Benutzereingaben) unter den Einschränkungen der einfachen Verwendung beschädigt werden können set /p, es ist wahrscheinlich am einfachsten , nur um Ihre .bat oder .cmd mit einem kompilierten C ++ oder C-Sprache ausführbar zu paaren und dann einfach coutoder printfdie Charaktere. Auf diese Weise können Sie auch problemlos mehrere Male in eine Zeile schreiben, wenn Sie eine Art Fortschrittsbalken oder etwas mit Zeichen anzeigen, wie es OP anscheinend war.

selten
quelle
@ Jiggunjer Bist du sicher? printfAus einem Win-7-Bereich zu kommen, cmdgibt mir"'printf' is not recognized as an internal or external command, operable program or batch file."
SeldomNeedy
printfist nicht in Windows nativ. Dies ist eine Windows-Frage.
KayleeFrye_onDeck
1
@kayleeFrye_onDeck Ich gehe davon aus, dass Ihr Kommentar an jiggunjer gerichtet ist , nicht an mich; In meiner Frage schlage ich vor, dass C und C ++ in Fällen, in denen die Formatierung wichtig ist, als ziemlich plattformunabhängige Alternative zu Shell-Befehlen verwendet werden könnten.
Selten Needy
1
Vergib mir, Vater, denn ich habe überflogen.
KayleeFrye_onDeck
Aber dann muss die Eingabe in die Shell korrekt analysiert werden. Wie würde ein solches Programm beispielsweise ein Anführungszeichen drucken?
Alex