2010-11-04 9 views
7

Spojrzałem na poprzednie pytania z twojej db i nie próbowałem odpowiedzi, ale próbuję.Echoing w tej samej linii

chciałbym napisać następujący kod linii:

echo Executing backup.... 
backup procedure 
echo Ok 

ale wyjście powinno być:

Executing backup... Ok 

to możliwe ?!

+1

Jakim systemem operacyjnym jesteś? –

+0

tak, Windows Server 2003, zapomniałem ... – aemme

Odpowiedz

9

Przypuszczam używasz DOS/NT partię.

Jest to możliwe za pomocą polecenia set/p, bo set/p nie drukuje crlf

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

Również jest to możliwe, aby usunąć wiersz znakiem CR. Ważne jest, aby wiedzieć, że białe znaki z przodu zestawu/p są ignorowane (w Vista, nie w XP), więc! Cr! musi umieścić później lub na końcu. CR może być wyświetlany tylko z opóźnionym rozszerzeniem, ponieważ% cr% działa, ale znaki CR są usuwane w fazie ekspansji procentowej (lub bezpośrednio po tej fazie), ale nie w fazie opóźnionego rozszerzania.

Przykład licznika, które wykorzystują tylko jedną linię do wyświetlania

@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: Wyjaśnienie, jak zmienna cr jest tworzony (Sporządzono z trick)

Po ustawieniu zmiennej X Do pojedyncza kropka (sam znak jest nieważny), powtarza się, aby stać się 8188 znakami poprzez for /L %%c in (1,1,13) DO set X=!X:~0,4094!!X:~0,4094!

Następnie va riable, dwie przestrzenie i zarówno CR i LF są echem w pliku z echo !X! > %temp%\cr.tmp (Zwróć uwagę na dwie przestrzenie między !X! i > i końcówki naturalna linia echo zmienia wewnętrznie)

teraz mamy 8192 znaków, ale dane bufor może zawierać tylko 8191 znaków, więc ostatni znak (linia) zostanie usunięty!

W następnej linii echo\>> %temp%\cr.tmp kolejna CR/LF zestaw jest dołączany do pliku (the \ w poleceniu jest tylko do wyjściowego niczego bar powrotu karetki i nowego wiersza, jak echo przez to self wyświetli ECHO is ON/OFF), że ważne jest, jako pojedynczy CR nie można odczytać na końcu linii (Więcej później).

Więc plik zawiera teraz <8188 .'s><SPACE><SPACE><CR><CR><LF>

for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do odczytuje drugi znak, że delimters są standardowe miejsca i zakładka, więc drugi znacznik jest tylko jeden CR, co ilustruje poniższy CR/LF jest usuwany jako średnia linia zakończona.

Wreszcie endlocal służy do powrotu do środowiska bez zmiennych tymczasowych X, c i a istniejące (jak w przypadku endlocal w nawiasach, umożliwia ustawienie cr przed endlocal faktycznie ma wpłynąć na koniec wsporników (można również zapisać jako for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do endlocal&set cr=%%a&goto :eof)

Dodatkowo

to był mój pierwszy sposób, aby stworzyć postać CR, ale wymaga to trochę czasu i plik tymczasowy.
Później zobaczyłem prostszą metodę pobierania CR z komendy copy /z.

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

Pierwszy przykład, który napisałeś działa perfetcyjnie. Do czego służy znak aemme

+0

jeb

+0

Umieszczenie user66001

2

Spróbuj na systemach zgodnych z POSIX (Linux)

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

Jest to o wiele trudniejsze w systemie Windows. Trzeba będzie użyć czegoś takiego:

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

sprawdzić ten wpis: http://www.pcreview.co.uk/forums/showpost.php?s=1a20b16775d915998b30bd76a0ec5d35&p=4432915&postcount=7.

+0

Pracuję z Windows Server 2003 .... – aemme

+0

@Piotr Czapla - Nie wierzę w/po każdym zestawie (przykład Windows) jest wymagany, a przynajmniej wydaje się pracować tak samo bez. Jednak po próbie ich usunięcia ktoś uniemożliwił edycję, więc może to jest złe http://stackoverflow.com/questions/13665411/what-does-a-forward-slash-before-a-pipe-in-cmd- Do-to-remove-the-line-ending-of-a # comment18755645_13665411. Czy możesz doradzić potrzebę /? – user66001

+0

potok tworzy nowe wystąpienia cmd.exe jest wymieniony w innych powiązanych thead (zobacz moją odpowiedź) –

1

To trochę hack, ale tutaj jest article describing how to do it dla Windows.

Z artykułu, wynik końcowy (edycja dla konfiguracji) wygląda następująco:

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

Backup_process %Result% >NUL 2>&1 

IF ERRORLEVEL 1 
    ECHO FAIL 
ELSE 
    ECHO OK 
+0

Dziękuję bardzo, mogę tylko przyjąć 1 odpowiedź ....Spojrzę na to – aemme

0

Zrobiłem coś podobnego za pomocą VBScript.

Umieść ten kod w EchoNoNewline.vbs:

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

z pliku wsadowym użyć skryptu takiego:

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

na What does a forward slash before a pipe in cmd do to remove the line ending of an echo? najlepsza propozycja jest taka:

Echo tekstu bez linii jest bardzo nieskuteczne, ponieważ potok tworzy dwa nowe wystąpienia cmd.exe. To znacznie prostsze i szybsze w użyciu

 <nul set /p "=My Text" 

przekierowanie z NUL będzie również zatrzymać czeka na dane wprowadzone przez użytkownika.

+0

Zastanawiam się, dlaczego ktoś mimo to ta odpowiedź nie jest przydatna –

+0

Bo ty "Czteroletnie spóźnienie i dokładnie to samo rozwiązanie, co zaakceptowana odpowiedź: – SomethingDark

+0

jesteś poważny? Odpowiedź, którą tu wysłałem, pochodzi z innego wątku. Zaakceptowana tutaj odpowiedź to bardzo długi tekst: –