windows - tagger - tag folders
¿Cómo puedo hacer que un script por lotes de Windows sea completamente silencioso? (5)
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).
Copia un directorio llamado html y todos sus contenidos en un directorio de destino en modo silencioso. Si el directorio de destino no está presente, aún así lo creará.
@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
/ S Copia directorios y subdirectorios, excepto los vacíos.
/ E Copia directorios y subdirectorios, incluidos los vacíos. Igual que / S / E. Puede usarse para modificar / T.
/ I Si el destino no existe y copia más de un archivo, se supone que el destino debe ser un directorio.
- / Y Suprime la solicitud para confirmar que desea sobrescribir un archivo de destino existente.
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"
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
Simplemente agregue un >NUL
al final de las líneas que producen los mensajes.
Por ejemplo,
COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat >NUL