Was ist das Windows-Batch-Äquivalent zum Linux-Shell-Befehl, echo -n
der den Zeilenumbruch am Ende der Ausgabe unterdrückt?
Die Idee ist, innerhalb einer Schleife in dieselbe Zeile zu schreiben.
windows
batch-file
cmd
newline
gregseth
quelle
quelle
echo
könnte,-n
abercmd.exe
es würde einfach nicht funktionieren ^^echo
nehmen könnte-n
" im Zusammenhang mit einer Frage zu Windows falsch.Antworten:
Mit
set
und dem/p
Parameter können Sie ohne Zeilenumbruch wiedergeben:Quelle
quelle
<nul set /p =Hello
.set /p
kann kein Gleichheitszeichen als erstes Zeichen oder Leerzeichen / Tabulatoren wiedergeben.< nul
ist eine Umleitung vomNUL
Gerät. Es enthält nichts, aber das ist genugset /p
, um nicht mehr auf Benutzereingaben zu wartenVerwenden 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=Hello
erhöht weiterhin den FEHLER auf 1.quelle
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
:writeInitialize
Methode 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
:write
und:writeVar
sind 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.quelle
ECHO.
, außerECHO.
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, istECHO(
.Als Ergänzung zur Antwort von @ xmechanix bemerkte ich beim Schreiben des Inhalts in eine Datei:
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:
Druckt die Zeichenfolge am Ende ohne Zeilenumbruch oder Leerzeichen.
quelle
World
und>
...set /p="abc"<nul|xxd -p
Anzeigen,616263
während esset /p=abc<nul|xxd -p
gibt61626320
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:
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:
anstatt:
Ich hoffe, es hilft
quelle
Sie können die Newline mit "tr" aus gnuwin32 ( coreutils- Paket) entfernen.
Übrigens, wenn Sie viel schreiben, ist gnuwin32 eine Goldmine.
quelle
trim
?\r
,\n
oder\r\n
(neue Linien in OSX, Posix und Windows bezeichnet) sind nicht „Raum“ Zeichen.Hier ist eine andere Methode, sie verwendet Powershell Write-Host, der einen -NoNewLine-Parameter hat, kombiniert diesen mit
start /b
und bietet die gleiche Funktionalität aus dem Batch.NoNewLines.cmd
Ausgabe
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.
quelle
und auch beginnend mit Leerzeichen zu wiederholen
quelle
Vielleicht ist es das, wonach du suchst, es ist ein Drehbuch der alten Schule ...: P.
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".
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.
quelle
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 neuenecho
jedes Mal Befehl, damit die Newline. Sie können es schriftlich überprüfenecho "%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.DIY-
cw.exe
Dienstprogramm (Konsolenschreiben)Wenn Sie es nicht sofort finden, können Sie selbst basteln. Mit diesem
cw
Dienstprogramm 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
.bat
Datei mit dem folgenden Inhalt.Starte es.
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
.exe
an 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:
quelle
Ich habe aus @arneps Idee eine Funktion gemacht:
hier ist es:
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.
quelle
Beispiel 1: Dies funktioniert und erzeugt Exit-Code = 0. Das ist gut. Beachten Sie das "." direkt nach dem Echo.
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.
Dies ist eine Meldung, die so angezeigt wird, als würde Linux echo -n sie anzeigen ... 1
quelle
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 dasbackspace
Zeichen.quelle
Ich glaube, es gibt keine solche Option. Alternativ können Sie dies versuchen
quelle
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:
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 "!" ;)
quelle
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 einfachcout
oderprintf
die 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.quelle
printf
Aus einem Win-7-Bereich zu kommen,cmd
gibt mir"'printf' is not recognized as an internal or external command, operable program or batch file."
printf
ist nicht in Windows nativ. Dies ist eine Windows-Frage.