web-dev-qa-db-fra.com

Comment rendre un script batch Windows complètement silencieux?

Il y a eu des variantes de cette question depuis des générations, mais malgré l'écriture de scripts Windows assez compliqués, je n'arrive pas à trouver comment les rendre silencieuses.

Voici un extrait de l'un de mes scripts actuels:

@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

Le résultat de ceci est:

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

C:\Temp>

Attendu que le "1 fichier (s) copié". est simplement ennuyeux, le "Fichier non trouvé" donne à l’utilisateur l’impression que quelque chose ne va pas (ce qui n’est pas le cas - aucun fichier n’est correct).

39
Mike Sadler

Pour supprimer la sortie, utilisez la redirection vers NUL.

Les commandes de la console utilisent deux types de sorties:

  • sortie standard ou stdout,

  • erreur standard ou stderr.

Parmi les deux, stdout est utilisé plus souvent, à la fois par des commandes internes, comme copy, et par des utilitaires de console, ou par des commandes externes, comme find et d’autres, ainsi que par des programmes de console tiers.

>NUL supprime la sortie standard et fonctionne correctement, par ex. pour supprimer le message 1 file(s) copied. de la commande copy. Une autre syntaxe est 1>NUL. Alors,

COPY file1file2>NUL

ou

COPY file1file21>NUL

ou

>NUL COPY file1file2

ou

1>NUL COPY file1file2

supprime toute la sortie standard de COPY.

Pour supprimer les messages d'erreur, qui sont généralement imprimés sur stderr, utilisez plutôt 2>NUL. Donc, pour supprimer un message File Not Found que DEL imprime lorsque, eh bien, le fichier spécifié n’est pas trouvé, ajoutez simplement 2>NUL au début ou à la fin de la ligne de commande:

DEL file2>NUL

ou

2>NUL DEL file

Bien qu'il soit parfois préférable de vérifier si le fichier existe avant d'essayer de le supprimer, comme vous le faites dans votre propre solution. Notez cependant qu'il n'est pas nécessaire de supprimer les fichiers un par un à l'aide d'une boucle. Vous pouvez utiliser une seule commande pour supprimer le lot:

IF EXIST "%scriptDirectory%*.noext" DEL "%scriptDirectory%*.noext"
71
Andriy M

Si vous souhaitez que toutes les sorties normales de votre script Batch soient silencieuses (comme dans votre exemple), le moyen le plus simple consiste à exécuter le fichier Batch avec une redirection:

C:\Temp> test.bat >nul

Cette méthode ne nécessite pas de modifier une seule ligne du script et continue d'afficher des messages d'erreur à l'écran. Pour supprimer tous la sortie, y compris les messages d'erreur:

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

Si votre script comporte des lignes produisant une sortie que vous souhaitez voir apparaître à l'écran, il sera peut-être plus simple d'ajouter une redirection vers ceux lineas au lieu de toutes les lignes que vous souhaitez garder en mode silence:

@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

11
Aacini

Ajoutez juste un >NUL à la fin des lignes produisant les messages.

Par exemple,

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

3
Unknown

Vous pouvez rediriger stdout vers nul pour le masquer.

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

Ajoutez simplement >nul aux commandes dont vous souhaitez masquer la sortie.

Ici vous pouvez voir toutes les différentes façons de rediriger les flux std.

2
Bali C

Copie un répertoire nommé html & tout son contenu dans un répertoire de destination en mode silencieux. Si le répertoire de destination n'est pas présent, il le créera quand même.

@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 Copie les répertoires et les sous-répertoires sauf ceux vides.

  2. / E Copie les répertoires et les sous-répertoires, y compris les répertoires vides. Identique à/S/E. Peut être utilisé pour modifier/T.

  3. / I Si la destination n'existe pas et que vous copiez plus d'un fichier, supposez que cette destination doit être un répertoire.

  4. / Y Supprime l'invite pour confirmer que vous souhaitez écraser un fichier de destination existant.
1
Hamzeen Hameem