batch-file tag - ¿Cómo puedo hacer que un script por lotes de Windows sea completamente silencioso?




folders space (5)

Para suprimir la salida, use la redirección a NUL .

Hay dos tipos de resultados que usan los comandos de la consola:

  • salida estándar, o stdout ,

  • error estándar, o stderr .

De los dos, stdout se usa con mayor frecuencia, tanto por comandos internos, como copy , y por utilidades de consola, o comandos externos , como find y otros, así como por programas de consola de terceros.

>NUL suprime la salida estándar y funciona bien, por ejemplo, para suprimir los 1 file(s) copied. mensaje del comando de copy . Una sintaxis alternativa es 1>NUL . Asi que,

COPY file1 file2 >NUL

o

COPY file1 file2 1>NUL

o

>NUL COPY file1 file2

o

1>NUL COPY file1 file2

suprime toda la salida estándar de COPY .

Para suprimir mensajes de error, que normalmente se imprimen en stderr , use 2>NUL lugar. Por lo tanto, para suprimir un mensaje de File Not Found que DEL imprime cuando, bueno, no se encuentra el archivo especificado, simplemente agregue 2>NUL al principio o al final de la línea de comando:

DEL file 2>NUL

o

2>NUL DEL file

Aunque a veces puede ser una mejor idea verificar realmente si el archivo existe antes de tratar de eliminarlo, como lo hace en su propia solución. Tenga en cuenta, sin embargo, que no necesita eliminar los archivos uno por uno, utilizando un bucle. Puede usar un solo comando para eliminar el lote:

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

Ha habido variantes de esta pregunta durante generaciones, pero a pesar de escribir algunas secuencias de comandos de Windows bastante complicadas, parece que no puedo encontrar la manera de silenciarlas.

El siguiente es un extracto de uno de mis scripts actuales:

@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

El resultado de esto es:

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

C:\Temp>

Considerando que el "1 archivo (s) copiado". es simplemente molesto, el "Archivo no encontrado" hace que el usuario piense que algo ha salido mal (lo cual no ha sucedido, ningún archivo está bien).


Simplemente agregue un >NUL al final de las líneas que producen los mensajes.

Por ejemplo,

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


Puede redirigir stdout a nul para ocultarlo.

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

Simplemente agregue >nul a los comandos de los que desea ocultar la salida.

Here puede ver todas las diferentes formas de redirigir las transmisiones estándar.


Si desea que todo el resultado normal de su secuencia de comandos por lotes sea silencioso (como en su ejemplo), la forma más fácil de hacerlo es ejecutar el archivo por lotes con una redirección:

C:\Temp> test.bat >nul

Este método no requiere modificar una sola línea en el script y aún muestra mensajes de error en la pantalla. Para suprimir todos los resultados, incluidos los mensajes de error:

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

Si su secuencia de comandos tiene líneas que producen resultados que desea que aparezcan en la pantalla, quizás sea más sencillo agregar una redirección a esas líneas en lugar de todas las líneas que desea mantener en silencio:

@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


Se pueden poner varios comandos entre paréntesis y repartirlos en numerosas líneas; Así que algo como echo hi && echo hello se puede poner así:

( echo hi
  echo hello )

También las variables pueden ayudar:

set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
  start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...

También noté con caretes ( ^ ) que a los condicionales if les gustaba que siguieran solo si había un espacio presente:

if exist ^




windows batch-file cmd echo