Comment puis-je rendre un script Windows batch complètement silencieux?

il y a eu des variantes de cette question posée depuis des générations, mais malgré l'écriture de scripts Windows assez compliqués, Je n'arrive pas à trouver comment les faire réellement silencieux.

voici un extrait d'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 cela est la suivante:

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

C:Temp>

alors que le "1 fichier(s) copié (s)."est juste ennuyeux, le" fichier non trouvé " fait penser à l'utilisateur que quelque chose a mal tourné (ce qu'il n'a pas - pas de fichiers est très bien).

33
demandé sur Ross Ridge 2013-02-04 16:01:00

5 réponses

pour supprimer la sortie, utilisez la redirection vers NUL.

il existe deux types de sortie que les commandes de la console utilisent:

  • sortie standard, ou stdout,

  • erreur type, ou stderr.

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

>NUL supprime la sortie standard et fonctionne très bien, par exemple pour supprimer le 1 file(s) copied. message copy la commande. Une autre syntaxe est 1>NUL. Donc,

COPY file1 file2 >NUL

ou

COPY file1 file2 1>NUL

ou

>NUL COPY file1 file2

ou

1>NUL COPY file1 file2

supprime tous COPYest la sortie standard.

Pour supprimer les messages d'erreur, qui sont généralement imprimés stderr, utilisez 2>NUL à la place. Donc, pour supprimer un File Not Found message DEL imprime quand, bien, le fichier spécifié n'est pas trouvé, il suffit d'ajouter 2>NUL soit au début ou à la fin de la ligne de commande:

DEL file 2>NUL

ou

2>NUL DEL file

Bien que parfois, il peut être une meilleure idée de vérifier si le fichier existe avant d'essayer de le supprimer, comme vous le faites dans votre propre solution. Notez, cependant, que vous n'avez pas besoin de supprimer les fichiers un par un, à l'aide d'une boucle. Vous pouvez utiliser un seul commande pour supprimer le lot:

IF EXIST "%scriptDirectory%*.noext" DEL "%scriptDirectory%*.noext"
57
répondu Andriy M 2013-02-04 12:39:22

si vous voulez que toute la sortie normale de votre script Batch soit silencieuse( comme dans votre exemple), la meilleure façon de le faire est d'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 dans le script et elle affiche toujours des messages d'erreur à l'écran. De suppression la sortie, y compris les messages d'erreur:

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

si votre script a des lignes qui produisent une sortie que vous voulez voir apparaître à l'écran, peut-être il est plus simple d'ajouter une redirection vers ceux lineas au lieu de toutes les lignes que vous voulez garder le 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

8
répondu Aacini 2013-02-04 18:41:59

il suffit d'ajouter un >NUL à la fin des lignes qui produisent les messages.

Par exemple,

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

3
répondu Unknown 2013-02-04 12:05:37

vous pouvez rediriger stdout vers nul pour le cacher.

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

il suffit d'ajouter >nul aux commandes dont vous voulez masquer la sortie.

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

2
répondu Bali C 2013-02-04 12:05:14

Copie un répertoire nommé html & tout son contenu vers un répertoire de destination en mode silencieux. Si le répertoire de destination n'est pas présent, il va encore créer.

@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 qui sont vides.

  2. / f 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 copier plus d'un fichier, suppose que la destination doit être un répertoire.

  4. /Y Supprime la demande de confirmation de remplacement de un fichier de destination existant.
1
répondu Hamzeen Hameem 2015-09-28 07:12:27