2015-04-20 21 views
5

Sto lavorando a uno script che esegue un'applicazione della riga di comando che richiede l'input dell'utente in fase di esecuzione (purtroppo non vengono forniti argomenti della riga di comando).Windows cmd eco/pipe aggiunge ulteriore spazio alla fine: come ridurlo?

Così il mio primo tentativo si presentava così:

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

A prima vista sembrava che ha funzionato abbastanza bene, ma come si è scoperto che non ha fatto. Dopo le indagini ho scoperto che la directory che stavo passando al software conteneva spazio extra alla fine, il che ha causato alcuni problemi.

Mi sono guardato un po 'in giro e ho scoperto la seguente domanda: echo is adding space when used with a pipe.

Questo ha spiegato cosa sta succedendo, ma in realtà non mi ha aiutato a risolvere il mio problema (non ho molta familiarità con la programmazione in batch).

Al momento mi "tipo di risolto" il mio problema con una soluzione brutta:

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

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

del omg.txt 

Questa soluzione funziona, ma sono meno soddisfatto. C'è un modo più carino? O ancora più brutto, ma senza file temporanei?

risposta

6

Soluzione1: Linefeeds

È possibile utilizzare un avanzamento riga per evitare gli spazi.
Il rem. è necessaria per evitare problemi con la iniettato & da 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 

Quando un blocco viene convogliata cmd.exe ricostruirà blocco costruendo una singola linea combinata con ampersands tra ciascun comando.

(
echo line1 
echo line2 
) | sort 

saranno convertiti in

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

Così i risultati avanzamento riga trucco in una linea come

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

e questo si espande per

(echo line1 
rem. & echo line2 
rem.) 

Solution2: Fuga d e commerciali
È anche possibile utilizzare direttamente la e commerciale, ma è necessario che siano sfuggiti, altrimenti gli spazi vengono comunque iniettati.
L'ultima rem. è quello di evitare uno spazio dopo l'ultima eco

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

Solution3: Creare un unico comando
@MCND menzionato il trucco per utilizzare direttamente il modulo:

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

Questo funziona, poiché il parser vede solo il comando cmd, il resto viene gestito come parametri per questo singolo comando.
Quindi non ci sono problemi con gli spazi. O con i ritorni a capo Sembra

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

e poi si può modificare anche

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

Proprio per il completamento, forse si potrebbe includere 'cmd/q/c" (eco linea 1) & (echo line2) & (echo line3) "| more' –

+0

Grazie! Ho usato la seconda soluzione e funziona come un fascino.^_^ – Dino

+0

Grazie per l'ottima risposta. Ho usato Solution2 in questo modo (nuove linee non sono ammessi nei commenti quindi "" è una nuova linea qui): '( eco b^&^ eco a^&^ rem .) | sort' in modo da non dover mettere tutto in una riga. – anilech