2013-02-04 14 views
30

Ci sono state varianti di questa domanda per generazioni, ma nonostante la scrittura di alcuni script di Windows piuttosto complicati, non riesco a capire come renderli realmente silenziosi.Come faccio a rendere lo script batch di Windows completamente silenzioso?

Quello che segue è un estratto da uno dei miei script attuali:

@ECHO OFF 
SET scriptDirectory=%~dp0 
COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat 
FOR /F %%f IN ('dir /B "%scriptDirectory%*.noext"') DO (
del "%scriptDirectory%%%f" 
) 
ECHO 

Il risultato di questo è:

C:\Temp> test.bat 
     1 file(s) copied. 
File Not Found 
Echo is off. 

C:\Temp> 

considerando che il "1 file (s) copiato." è solo fastidioso, il "File non trovato" fa pensare all'utente che qualcosa è andato storto (cosa che non ha - nessun file va bene).

+1

Se hai finito per utilizzare una soluzione diversa da quelle indicate, aggiungi la tua risposta e accettala. Non aggiungere la soluzione alla domanda stessa. –

+0

In realtà sono riuscito a rimuovere il secondo output "File non trovato" con il prefisso con if-condition: IF EXIST "% scriptDirectory% *. Noext" FOR/F %% f IN ('dir/B "% scriptDirectory % *. noext "') DO (...Questo in origine non funzionava perché avevo provato ad usare IF DO(). –

+0

Ho cambiato il titolo per riflettere il commento di [bobstein-visibone [piuttosto aspro, IMHO]. –

risposta

55

che sopprime l'output, uso reindirizzamento NUL.

Ci sono due tipi di output che utilizzano comandi della console:

  • standard output, o stdout,

  • errore standard, o stderr.

Dei due, stdout viene utilizzato più spesso, sia dai comandi interni, come copy, e da utility console o esterni comandi, come find ed altri, nonché da programmi di console terzi .

>NUL sopprime l'uscita standard e funziona correttamente, ad es. per sopprimere il messaggio 1 file(s) copied. del comando copy. Una sintassi alternativa è 1>NUL. Così,

COPY file1file2>NUL 

o

COPY file1file21>NUL 

o

>NUL COPY file1file2 

o

1>NUL COPY file1file2 

sopprime tutte standard output COPY s'.

Per sopprimere i messaggi di errore, che in genere vengono stampati su stderr, utilizzare invece 2>NUL. Così, per sopprimere un messaggio File Not Found che DEL stampe quando, beh, il file specificato non viene trovato, basta aggiungere 2>NUL o all'inizio o alla fine della riga di comando:

DEL file2>NUL 

o

2>NUL DEL file 

Anche se a volte può essere una buona idea verificare effettivamente se il file esiste prima di provare ad eliminarlo, come si sta facendo nella propria soluzione. Notare, tuttavia, che non è necessario eliminare i file uno per uno, utilizzando un loop. È possibile utilizzare un unico comando per eliminare il sacco:

IF EXIST "%scriptDirectory%*.noext" DEL "%scriptDirectory%*.noext" 
+0

Grazie, @AndriyM: il mio script effettivo non si limita a cancellare il file, ma l'ho rimosso per la domanda. Se uso 1> NUL, significa che i messaggi di errore verranno comunque visualizzati? Questo sarebbe un miglioramento. –

+1

@MikeSadler: Sì, '1> NUL' sopprime solo l'output standard. L'errore verrà comunque visualizzato. Quando è necessario sopprimere * all * l'output per un comando, utilizzare sia '1> NUL' e' 2> NUL' con esso. –

+0

è perfetto: sono felice che l'utente veda i messaggi di errore, se ce ne sono. –

2

È possibile reindirizzare lo standard su nul per nasconderlo.

COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat >nul 

Basta aggiungere >nul ai comandi che si desidera nascondere l'output.

Here è possibile visualizzare tutti i diversi modi di reindirizzare i flussi std.

3

Basta aggiungere uno >NUL alla fine delle righe che producono i messaggi.

Ad esempio,

COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat >NUL

8

Se si desidera che tutti i normali uscita del vostro script Batch tacere (come nel tuo esempio), il modo più semplice per farlo è quello di eseguire il file batch con un reindirizzamento:

C:\Temp> test.bat >nul 

Questo metodo non richiede di modificare una sola riga dello script e mostrano ancora i messaggi di errore nella schermata. Per sopprimere tutto l'uscita, tra cui i messaggi di errore:

C:\Temp> test.bat >nul 2>&1 

Se lo script ha linee che producono uscita che si desidera visualizzare a schermo, forse sarà più semplice per aggiungere il reindirizzamento a quei Lineas invece di tutti i le linee che si desidera mantenere il silenzio:

@ECHO OFF 
SET scriptDirectory=%~dp0 
COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat 
FOR /F %%f IN ('dir /B "%scriptDirectory%*.noext"') DO (
del "%scriptDirectory%%%f" 
) 
ECHO 
REM Next line DO appear in the screen 
ECHO Script completed >con 

Antonio

1

Copia una directory denominata html & tutto il suo contenuto in una directory di destinazione in modalità silenziosa. Se la directory di destinazione non è presente, la creerà comunque.

@echo off 
TITLE Copy Folder with Contents 

set SOURCE=C:\labs 
set DESTINATION=C:\Users\MyUser\Desktop\html 

xcopy %SOURCE%\html\* %DESTINATION%\* /s /e /i /Y >NUL 

  1. /S Copia directory e sottodirectory tranne quelle vuote.

  2. /E Copie directory e sottodirectory, incluse quelle vuote . Come/S/E. Può essere usato per modificare/T.

  3. /I Se la destinazione non esiste e la copia di più di un file , presuppone che la destinazione sia una directory.

  4. /Y Elimina la richiesta di conferma per sovrascrivere un file di destinazione esistente .
Problemi correlati