2010-11-04 9 views
7

Ich habe mir die vorherigen Fragen Ihres db angesehen und habe keine Antwort versucht, aber ich versuche es.Echo in der gleichen Zeile

Ich mag würde die folgenden Zeilen Code schreiben:

echo Executing backup.... 
backup procedure 
echo Ok 

aber die Ausgabe sollte sein:

Executing backup... Ok 

das möglich ist ?!

+1

Welches Betriebssystem sind Sie? –

+0

ja, Windows Server 2003, ich habe vergessen ... – aemme

Antwort

9

Ich nehme an, Sie dos/nt-batch verwenden.

Es ist möglich, mit dem Satz/p Befehl, weil set/p keine CrLf

set /p "=Executing backup...." <nul 
echo OK 

Auch druckt es ist möglich, die Leitung mit einem CR-Zeichen zu löschen. Es ist wichtig zu wissen, dass Leerzeichen an der Vorderseite eines Sets/p ignoriert werden (in Vista, nicht in XP), also das! Cr! muss später oder am Ende platziert werden. Ein CR kann nur mit delayedExpansion angezeigt werden, weil% cr% funktioniert, aber CR-Zeichen werden in der prozentualen Expansionsphase (oder direkt nach dieser Phase) entfernt, aber nicht in der verzögerten Expansionsphase.

Beispiel eines Zählers, der zur Anzeige von

@echo off 
setlocal EnableDelayedExpansion EnableExtensions 


call :CreateCR 
for /l %%n in (1,1,10000) do (
    set /P "=Count %%n!CR!" <nul 
) 
echo(
goto :eof 

:CreateCR 
rem setlocal EnableDelayedExpansion EnableExtensions 
set "X=." 
for /L %%c in (1,1,13) DO set X=!X:~0,4094!!X:~0,4094! 

echo !X! > %temp%\cr.tmp 
echo\>> %temp%\cr.tmp 
for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do (
    endlocal 
    set cr=%%a 
    goto :eof 
) 
goto :eof 

EDIT nur eine Zeile verwenden: Erläuterung, wie die Variable cr erstellt wird (mit einem Trick Fertig)

Nach variable X auf eine Einstellung, Einzelpunkt (das Zeichen selbst ist unwichtig), wird es wiederholt, um 8188 Zeichen über for /L %%c in (1,1,13) DO set X=!X:~0,4094!!X:~0,4094!

Dann die va riablen, zwei Räume und sowohl ein CR und LF werden in eine Datei hallen mit echo !X! > %temp%\cr.tmp (Beachten Sie die beiden Räume zwischen den !X! und den > und die natürlichen Zeilenenden Echo wieder gut intern)

Wir haben jetzt 8192 Zeichen, aber die Daten Der Puffer kann nur 8191 Zeichen enthalten, daher wird das letzte Zeichen (der Zeilenvorschub) gelöscht!

In der nächsten Zeile echo\>> %temp%\cr.tmp, ein weiterer CR/LF Satz an die Datei angehängt wird (die \ in dem Befehl zur Ausgabe nichts ist nur den Wagenrücklauf und Zeilenvorschub bar, wie echo durch sie selbst ausgibt ECHO is ON/OFF ist), das ist wichtig, als eine einzige CR kann nicht am Ende einer Zeile (mehr später) gelesen werden.

So enthält die Datei jetzt <8188 .'s><SPACE><SPACE><CR><CR><LF>

Die for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do das zweite Token liest, die delimters sind Standardraum und Reiter, so dass die zweite Token ist nur ein einziges CR, wie die folgenden CR/LF als Standardzeilenende entfernt wird.

Schließlich wird die endlocal verwendet wird, ohne die temporären Variablen in eine Umgebung zurückzukehren X, c und a bestehende (Wie bei den endlocal in Klammern, es erlaubt die Einstellung von cr vor den endlocal nimmt tatsächlich am Ende der Klammern beeinflussen (könnte auch als for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do endlocal&set cr=%%a&goto :eof geschrieben werden)

Zusätzlich

Dies war mein erster Weg, um ein CR-Zeichen zu schaffen, aber es braucht einige Zeit und eine temporäre Datei.
Später sah ich eine einfachere Methode zum Abrufen der CR aus einem copy /z Befehl.

for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a" 
+0

Das erste Beispiel, das Sie geschrieben haben, funktioniert perfekt. Wofür ist das Zeichen aemme

+0

jeb

+0

Setzen user66001

2

Versuchen Sie dies auf Posix-System (Linux)

echo -n "Executing backup.... " 
echo -n "backup procedure " 
echo "Ok" 

Es ist viel schwieriger unter Windows. Sie werden so etwas benötigen:

@echo off 
echo|set /p ="Executing backup...." 
echo|set /p =" backup procedure" 

prüfen diesen Beitrag: http://www.pcreview.co.uk/forums/showpost.php?s=1a20b16775d915998b30bd76a0ec5d35&p=4432915&postcount=7.

+0

Ich arbeite mit Windows Server 2003 .... – aemme

+0

@Piotr Czapla - Ich glaube nicht, dass die/nach jedem Satz (Windows-Beispiel) erforderlich ist, oder zumindest scheint es ohne zu arbeiten. Beim Versuch, sie zu entfernen, hat jedoch jemand die Bearbeitung verhindert, also ist das vielleicht falsch http://stackoverflow.com/questions/13665411/what-does-aa-forward-slash-before-a-ipipe-in-cmd- do-to-remove-the-line-Ende-of-a # comment18755645_13665411. Kannst du die Notwendigkeit für die/'s beraten? – user66001

+0

die Pipe erstellt neue cmd.exe Instanzen wird bei anderen verwandten thead erwähnt (siehe meine Antwort) –

1

Es ist ein bisschen wie ein Hack, aber hier ist ein article describing how to do it für Windows.

Aus dem Artikel, das Endergebnis (für das Setup bearbeitet) sieht wie folgt aus:

SET /P var=Backing up 
%Result%....<NUL 

Backup_process %Result% >NUL 2>&1 

IF ERRORLEVEL 1 
    ECHO FAIL 
ELSE 
    ECHO OK 
+0

Vielen Dank, kann ich nur 1 Antwort akzeptieren ....Ich werde es betrachten – aemme

0

Ich habe etwas ähnliches mit einem VBScript getan.

diesen Code Setzen Sie in EchoNoNewline.vbs:

If WScript.Arguments.Named.Exists("TEXT") Then 
    WScript.StdOut.Write WScript.Arguments.Named.Item("TEXT") 
End If 

aus Ihrer Batch-Datei, um das Skript wie folgt verwenden:

CSCRIPT EchoNoNewLine.vbs //NOLOGO /TEXT:"Executing backup...." 
backup procedure 
CSCRIPT EchoNoNewLine.vbs //NOLOGO /TEXT:"Ok" 
-1

bei What does a forward slash before a pipe in cmd do to remove the line ending of an echo? der beste Vorschlag ist:

Echo-Text ohne Zeilenvorschub ist sehr ich nichtig, da eine Pipe zwei neue Instanzen von cmd.exe erstellt. Es ist viel einfacher und schneller

 <nul set /p "=My Text" 

Die Umleitung von NUL zu verwenden, wird auch das Warten auf Benutzereingabe stoppen.

+0

frage mich, warum jemand diese Antwort nicht sinnvoll ist –

+0

Weil Sie sind vier Jahre zu spät und haben genau die gleiche Lösung wie die angenommene Antwort. – SomethingDark

+0

meinst du das? Die Antwort, die ich hier geschickt habe, stammt aus einem anderen Thread. Die akzeptierte Antwort hier ist ein sehr langer Text statt –