2015-04-20 19 views
5

Pracuję nad skryptem, który uruchamia aplikację wiersza poleceń, która wymaga wprowadzania danych przez użytkownika w czasie wykonywania (niestety nie podano argumentów wiersza poleceń).Windows cmd echo/pipe dodaje dodatkową przestrzeń na końcu - jak ją przyciąć?

Więc moja pierwsza próba wyglądała tak:

@echo off 
(echo N 
echo %~dp0%SomeOther\Directory\ 
echo Y)|call "%~dp0%SomeDirectory\SadSoftware.exe" 

Na pierwszy rzut oka wyglądało to działało całkiem dobrze, ale jak się okazało, że nie. Po przeprowadzeniu dochodzenia dowiedziałem się, że katalog, który przekazywałem do oprogramowania, zawierał dodatkowy obszar na końcu, co spowodowało pewne problemy.

Rozglądałem się przez chwilę i dowiedziałem się następującego pytania: echo is adding space when used with a pipe.

To wyjaśniło, co się dzieje, ale tak naprawdę nie pomogło mi rozwiązać mojego problemu (nie jestem zbyt zaznajomiony z programowaniem wsadowym).

W tej chwili „rodzaj rozwiązany” mojego problemu z brzydkim obejścia:

echo N> omg.txt 
echo %~dp0%SomeOther\Directory\>> omg.txt 
echo Y>> omg.txt 

"%~dp0%SomeDirectory\SadSoftware.exe"<omg.txt 

del omg.txt 

To rozwiązanie działa, ale jestem mniej niż z niego zadowolony. Czy jest jakiś ładniejszy sposób? Lub jeszcze brzydszy sposób, ale bez tymczasowego pliku?

Odpowiedz

6

Porada1: karetki

Można użyć wysuw uniknąć spacji.
rem. jest konieczne w celu uniknięcia problemów z wprowadzoną & przez cmd.exe

SET LF=^ 


REM ** The two empts lines are required for the new line ** 

(
echo line1%%LF%%rem. 
echo line2%%LF%%rem. 
echo line3%%LF%%rem. 
) | sort 

Kiedy blok jest przetłaczany cmd.exe odbudowuje bloku o budowie jednej linii łączone znakami między każdego polecenia.

(
echo line1 
echo line2 
) | sort 

zostaną zamienione na

C:\Windows\system32\cmd.exe /S /D /c" (<space>echo line1<space>&<space>echo line2<space>)" 

Więc wyniki wysuwu wiersza trick w linii jak

C:\Windows\system32\cmd.exe /S /D /c" (echo line1%LF%rem. & echo line2%LF%rem.)" 

a to rozszerza się

(echo line1 
rem. & echo line2 
rem.) 

Roztworu 2.: Ucieczka d ampersandy Można również użyć bezpośrednio ampersandów, ale muszą one zostać zmienione, w przeciwnym razie przestrzenie zostaną wstrzyknięte.
Ostatni rem. jest uniknięcie miejsca po ostatnim echem

( 
    echo Line1^&echo Line2^&echo Line3^&rem. 
) | more 

Solution3: Tworzenie pojedynczego polecenia
@MCND wspomniano sprawę bezpośrednio do korzystania z formularza:

cmd /q /c"(echo line1&echo line2&echo line3)" | sort 

ten działa, ponieważ analizator składni widzi tylko komendę cmd, reszta jest obsługiwana jako parametry dla tego pojedynczego polecenia.
Dlatego nie ma żadnych problemów ze spacjami. Albo z karetki wygląda

cmd /q /c"(echo line1%%LF%%echo line2%%LF%%echo line3)"| (sort > out.txt) 

a następnie można modyfikować także

cmd /q /c^"(echo line1%%LF%%^ 
echo line2%%LF%%^ 
echo line3)^"| (sort > out.txt) 
+2

Tylko dla zakończenia, może można to 'cmd/Q/C" (echo line1) & (echo line2) & (echo line3) "| more' –

+0

Dzięki! Użyłem drugiego rozwiązania i działa jak czar.^_^ – Dino

+0

Dzięki za wspaniałą odpowiedź. Użyłem Solution2 w ten sposób (nowe linie nie są dozwolone w komentarzach zatem "" to nowa linia tutaj): '( echo b^&^ echo^&^ rem .) sort " , więc nie musisz umieszczać wszystkiego w jednym wierszu. – anilech

Powiązane problemy