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).
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"
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
Ajoutez juste un >NUL
à la fin des lignes produisant les messages.
Par exemple,
COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat >NUL
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.
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
/ S Copie les répertoires et les sous-répertoires sauf ceux vides.
/ 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.
/ I Si la destination n'existe pas et que vous copiez plus d'un fichier, supposez que cette destination doit être un répertoire.