J'ai un script batch qui exécute une tâche et envoie la sortie dans un fichier texte. Existe-t-il également un moyen d'afficher la sortie sur la fenêtre de la console?
Par exemple:
c:\Windows>dir > windows-dir.txt
Existe-t-il un moyen d' dir
afficher la sortie de l' affichage dans la fenêtre de la console et de la placer dans le fichier texte?
windows
batch-file
cmd
JamesEggers
la source
la source
Réponses:
Non, vous ne pouvez pas avec la redirection pure.
Mais avec quelques astuces (comme tee.bat ) vous pouvez.
J'essaye d'expliquer un peu la redirection.
Vous redirigez l'un des dix flux avec > fichier ou <fichier.
Cela n'a pas d'importance, si la redirection est avant ou après la commande, donc ces deux lignes sont presque les mêmes.
La redirection dans cet exemple n'est qu'un raccourci pour 1> , cela signifie que le flux 1 (STDOUT) sera redirigé.
Ainsi, vous pouvez rediriger n'importe quel flux en ajoutant le numéro comme 2> err.txt et il est également permis de rediriger plusieurs flux sur une seule ligne.
Dans cet exemple, la "sortie standard" ira dans files.txt, toutes les erreurs seront dans err.txt et le stream3 ira dans rien.txt (DIR n'utilise pas le stream 3).
Stream0 est STDIN
Stream1 est STDOUT
Stream2 est STDERR
Stream3-9 n'est pas utilisé
Mais que se passe-t-il si vous essayez de rediriger le même flux plusieurs fois?
"Il ne peut y en avoir qu'un", et c'est toujours le dernier!
Donc, il est égal à dir> two.txt
Ok, il y a une possibilité supplémentaire, rediriger un flux vers un autre flux.
2> & 1 redirige stream2 vers stream1 et 1> files.txt redirige tout vers files.txt .
L'ordre est important ici!
sont différents. Le premier redirige tout (STDOUT et STDERR) vers NUL,
mais la seconde ligne redirige le STDOUT vers NUL et STDERR vers le STDOUT "vide".
En guise de conclusion, il est évident que les exemples d'Otávio Décio et d'andynormancx ne peuvent pas fonctionner.
Les deux essaient de rediriger stream1 deux fois, mais "Il ne peut y en avoir qu'un", et c'est toujours le dernier.
Alors vous obtenez
Et dans le premier exemple, la redirection de stream1 vers stream1 n'est pas autorisée (et pas très utile).
J'espère que ça aide.
la source
3<&2
(notez le LT au lieu de GT), puis3>errors.txt
. Mais cela s'est mal terminé - toutes les sorties stderr suivantes ont été capturéeserrors.txt
(c'est-à-dire aussi à partir d'autres commandes!).for /f "delims=" %%v in ('dir') do echo %%v>>file.txt
cependant.Utilisez simplement la version Windows de la commande UNIX tee (disponible sur http://unxutils.sourceforge.net ) de cette manière:
Si vous avez également besoin de la sortie STDERR, utilisez ce qui suit.
Le
2>&1
combine la sortie STDERR en STDOUT (le flux principal).la source
1>tee a.txt
redirigera stdout vers un fichier nommétee
au lieu d'appeler latee
commande. Quelqu'un peut-il confirmer que cette réponse fonctionne pour eux?Si vous n'avez pas besoin de la sortie en temps réel (c'est-à-dire pendant que le programme l'écrit), vous pouvez ajouter
après cette ligne.
la source
dir > windows-dir.txt & type windows-dir.txt
. Cela vaut également pour les blocs:( echo %date% <NL> echo %username% <NL> echo %time% <NL> pause>CON )>test.txt & type test.txt
. Cependant, si la sortie est requise en temps réel, vous pouvez utiliser par exemple un port windows de l' outil tee pour cela…La solution qui a fonctionné pour moi était: dir> a.txt | tapez a.txt .
la source
Oui, il existe un moyen d'afficher une seule sortie de commande sur la console (écran) et dans un fichier. En utilisant votre exemple, utilisez ...
Explication détaillée:
La
FOR
commande analyse la sortie d'une commande ou d'un texte dans une variable, qui peut être référencée plusieurs fois.Pour une commande, telle que
DIR /B
, mettez entre guillemets simples comme indiqué dans l'exemple ci-dessous. Remplacez leDIR /B
texte par la commande souhaitée.Pour afficher du texte, placez le texte entre guillemets, comme indiqué dans l'exemple ci-dessous.
... et avec un habillage de ligne ...
Si vous avez des moments où vous souhaitez que la sortie soit uniquement sur la console (écran), et d'autres fois envoyés uniquement au fichier, et d'autres fois envoyés aux deux, spécifiez la clause "DO" de la boucle FOR à l'aide d'une variable, comme indiqué ci-dessous avec
%TOECHOWHERE%
.la source
delims=
place.la source
Si vous souhaitez ajouter au lieu de remplacer le fichier de sortie, vous pouvez utiliser
ou
la source
Mon option était la suivante:
Créez un sous-programme qui prend le message et automatise le processus d'envoi à la fois à la console et au fichier journal.
Si vous ajoutez une variable au message, assurez-vous de supprimer les guillemets avant de l'envoyer au sous-programme ou il peut visser votre lot. Bien sûr, cela ne fonctionne que pour l'écho.
la source
setlocal enabledelayedexpansion
au lieu de justesetlocal
2) J'utilise l'expansion retardée pour la variable de fichier journal, donc>> !logfile!
au lieu de>> %logfile%
dans le sous-programme. De cette façon, il fonctionne lorsqu'il est appelé depuis un bloc de code (comme dans une instruction if). 3) J'ai supprimé la ligne "set message" car il n'y a pas besoin de la variable supplémentaire. Nous l'avons déjà dans$~1
donc je l'aiecho $~1
pour les deux commandes d'écho.J'ai créé une console C # simple qui peut gérer la sortie en temps réel à la fois sur l'écran cmd et le journal
L'utilisation du fichier batch est la même que la façon dont vous utilisez Unix
tee
Et voici le référentiel qui inclut le Tee.exe au cas où vous n'auriez pas d'outil pour compiler https://github.com/iamshiao/Tee
la source
J'aime la réponse d'ATN, mais ce n'était pas aussi simple pour moi de télécharger que wintee , qui est également open source et ne donne que la fonctionnalité tee (utile si vous voulez juste un tee et pas l'ensemble des utilitaires unix). J'ai appris cela grâce à la réponse de davor à Afficher la sortie de l'invite de commande Windows et à la rediriger vers un fichier , où vous trouverez également des références aux utilitaires unix.
la source
La solution fournie par "Tomas R" fonctionne parfaitement pour la question de l'OP et est disponible nativement.
Essayez: chkdsk c:> output.txt | tapez output.txt
La sortie est de cette commande implique un pourcentage d'achèvement qui obtient une sortie en série dans le fichier, par conséquent, il semblera un peu désordonné (c'est-à-dire que le texte sera ajouté au fur et à mesure de sa progression). Cela n'arrive pas aux bits qui sont envoyés à STDOUT (l'écran). C'est ainsi que ce serait si vous exécutiez simplement la même commande sans redirection.
la source
Je pense que vous voulez quelque chose du genre:
Ou si vous voulez une nouvelle ligne:
Ces commandes sont parfaites pour les journaux.
Remarque: Cela va parfois pépin et remplacer tout le fichier texte sur mon ordinateur.
Autre note: si le fichier n'existe pas, il créera le fichier.
la source
>
est conçu pour écraser le fichier. Utilisez>>
pour ajouter )