Comment puis-je exécuter une application de ligne de commande dans l'invite de commande Windows et afficher la sortie à la fois et la rediriger vers un fichier en même temps?
Si, par exemple, je devais exécuter la commande dir > test.txt
, cela redirigerait la sortie vers un fichier appelé test.txt
sans afficher les résultats.
Comment pourrais-je écrire une commande pour afficher la sortie et rediriger la sortie vers un fichier dans l'invite de commandes Windows, similaire à la tee
commande sous Unix?
batch-file
cmd
stdout
tee
Edward Thomson
la source
la source
Réponses:
Pour développer la réponse de davor , vous pouvez utiliser PowerShell comme ceci:
Si vous essayez de rediriger la sortie d'un exe dans le répertoire courant, vous devez utiliser
.\
sur le nom de fichier, par exemple:la source
dir
dans powershell est un aliasGet-ChildItem
qui n'est pas comme ladir
commande interne de cmd . Vous avez besoinpowershell "cmd /c dir | tee test.txt"
si vous voulez la version interne de cmd2>&1
, par exemplenode 2>&1 | tee debug_log.txt
J'ai pu trouver une solution / solution de contournement de la redirection de la sortie vers un fichier puis vers la console:
où dir est la commande dont la sortie doit être redirigée, a.txt un fichier où stocker la sortie.
la source
&
au lieu d'un|
est nécessaire pour la sortie de certaines commandes, commeping
ou7z.exe
dir
. Exemple:chkdsk /f c: > c:\Temp.txt | c:\Temp.txt
. Le fichier de rapport système est verrouillé par un autre processus.handle output to stderr
- Ajoutez la2>&1
redirection pour qu'elle ressemble à ceci:dir 2>&1 > a.txt & type a.txt
et vous devriez avoir mélangé stderr avec stdout.Il y a un port Win32 de la
tee
commande Unix , qui fait exactement cela. Voir http://unxutils.sourceforge.net/ ou http://getgnuwin32.sourceforge.net/la source
tee
package de GnuWin32 , vous le trouverez dans gnuwin32.sourceforge.net/packages/coreutils.htm .Regarde ça: wintee
Pas besoin de cygwin.
J'ai rencontré et signalé quelques problèmes.
Vous pouvez également vérifier les non- sorties car il contient tee (et pas besoin de cygwin), mais attention, les EOL de sortie sont de type UNIX ici.
Enfin, si vous avez PowerShell, vous pouvez essayer Tee-Object. Tapez
get-help tee-object
dans la console PowerShell pour plus d'informations.la source
tee
sorties en temps réel.wtee
a la même fonctionnalité. Si cela ne vous dérange pas, cela fera très bien l'affaire.@ tori3852
Je l'ai trouvé
n'a pas fonctionné (quelques premières lignes de la liste des répertoires uniquement - suspectez une sorte de bifurcation du processus et la deuxième partie, la commande 'type' s'est terminée avant la fin de la liste des dés?), alors j'ai plutôt utilisé:
ce qui a fait - commandes séquentielles, on termine avant le deuxième démarre.
la source
&
place de&&
si vous voulez vous assurer que latype
commande est exécutée même si ladir
commande a échoué. Ceci est utile lorsqu'il y a eu une forme d'erreur dans votre commande et que vous souhaitez toujours voir le fichier journal sur la console. Voir l'article de Microsoft à ce sujet . Cependant, cela a le problème d'%errorlevel%
être réglé sur le niveau d'erreur detype
(qui serait 0).Malheureusement, il n'y a rien de tel.
Les applications de console Windows n'ont qu'une seule poignée de sortie. (Eh bien, il y en a deux
STDOUT
,STDERR
mais cela n'a pas d'importance ici) Le>
redirige la sortie normalement écrite dans le handle de console vers un handle de fichier.Si vous voulez avoir une sorte de multiplexage, vous devez utiliser une application externe vers laquelle vous pouvez détourner la sortie. Cette application peut alors écrire à nouveau dans un fichier et dans la console.
la source
tee
on * nix est aussi une application distincte, pas une redirection sur le shellUne simple application console C # ferait l'affaire:
Pour l'utiliser, il vous suffit de diriger la commande source dans le programme et de fournir le chemin de tous les fichiers vers lesquels vous souhaitez dupliquer la sortie. Par exemple:
Affiche les résultats de dir et stocke les résultats dans files1.txt et files2.txt.
Notez qu'il n'y a pas beaucoup (quoi que ce soit!) Dans la manière de gérer les erreurs ci-dessus, et la prise en charge de plusieurs fichiers peut ne pas être réellement nécessaire.
la source
Cela fonctionne, bien que ce soit un peu moche:
Il est un peu plus flexible que certaines des autres solutions, en ce sens qu'il fonctionne déclaration par déclaration afin que vous puissiez également l'utiliser pour l'ajouter. J'utilise cela un peu dans des fichiers batch pour enregistrer et afficher des messages:
Oui, vous pouvez simplement répéter l'instruction ECHO (une fois pour l'écran et la deuxième fois redirigée vers le fichier journal), mais cela semble tout aussi mauvais et est un peu un problème de maintenance. Au moins de cette façon, vous n'avez pas à modifier les messages à deux endroits.
Notez que _ n'est qu'un nom de fichier court, vous devrez donc vous assurer de le supprimer à la fin de votre fichier de commandes (si vous utilisez un fichier de commandes).
la source
type
commandes sur des lignes distinctes (dans un sous-programme) a cependant corrigé cela.mtee est un petit utilitaire qui fonctionne très bien à cet effet. C'est gratuit, la source est ouverte et ça marche.
Vous pouvez le trouver sur http://www.commandline.co.uk .
Utilisée dans un fichier batch pour afficher la sortie ET créer un fichier journal simultanément, la syntaxe ressemble à ceci:
Où / + signifie ajouter la sortie.
Cela suppose que vous avez copié mtee dans un dossier qui se trouve dans le PATH, bien sûr.
la source
Je voudrais développer un peu l' excellente réponse de Saxon Druce .
Comme indiqué, vous pouvez rediriger la sortie d'un exécutable dans le répertoire courant comme ceci:
Cependant, cela se connecte uniquement
stdout
àtest.txt
. Il ne se connecte pas égalementstderr
.La solution évidente serait d'utiliser quelque chose comme ceci:
Cependant, cela ne fonctionnera pas pour tous
something.exe
. Certainssomething.exe
s interpréteront le2>&1
comme un argument et échoueront. La bonne solution consiste à avoir uniquement des apostrophes autour dusomething.exe
et de ses commutateurs et arguments, comme ceci:la source
'tee' is not recognized as an internal or external command
pour des raisons évidentes. Avec la2>&1
ligne cmd à l'intérieur, toute sortie vers stderr provoque des erreurs de powershell.Je suis d'accord avec Brian Rasmussen, le port unxutils est le moyen le plus simple de le faire. Dans la section Fichiers batch de ses pages de script, Rob van der Woude fournit une mine d'informations sur l'utilisation des commandes MS-DOS et CMD. Je pensais qu'il pourrait avoir une solution native à votre problème et après avoir fouillé là-bas, j'ai trouvé TEE.BAT , qui semble être juste cela, une implémentation de langage batch MS-DOS de tee. C'est un fichier batch d'aspect assez complexe et mon inclination serait toujours d'utiliser le port unxutils.
la source
Si vous avez cygwin dans votre chemin d'accès à l'environnement Windows, vous pouvez utiliser:
la source
dir 1>a.txt 2>&1 | type a.txt
Cela aidera à rediriger STDOUT et STDERR
la source
Je sais que c'est un sujet très ancien, mais dans les réponses précédentes, il n'y a pas d'implémentation complète d'un Tee en temps réel écrit en batch. Ma solution ci-dessous est un script hybride Batch-JScript qui utilise la section JScript juste pour obtenir la sortie de la commande canalisée, mais le traitement des données se fait dans la section Batch. Cette approche présente l'avantage que tout programmeur Batch peut modifier ce programme pour répondre à des besoins spécifiques. Ce programme traite également correctement la sortie de la commande CLS produite par d'autres fichiers Batch, c'est-à-dire qu'il efface l'écran lorsque la sortie de la commande CLS est détectée.
la source
file.exe 2>output.txt
file.exe 2>&1|tee.bat
comme trouvé ici: superuser.com/questions/452763/…Je cherchais également la même solution, après un petit essai, j'ai réussi à y parvenir dans l'invite de commande. Voici ma solution:
Il capture même également n'importe quelle commande PAUSE.
la source
Voici un échantillon de ce que j'ai utilisé sur la base d'une des autres réponses
la source
Quelque chose comme ça devrait faire ce dont vous avez besoin?
la source
envoyer la sortie à la console, ajouter au journal de la console, supprimer la sortie de la commande actuelle
la source
Il s'agit d'une variante d'une réponse précédente de MTS, mais elle ajoute des fonctionnalités qui pourraient être utiles à d'autres. Voici la méthode que j'ai utilisée:
set _Temp_Msg_Cmd=
^
caractère carotte afin que les commandes ne soient pas évaluées initialement%~n0_temp.txt
qui utilise la syntaxe d'extension de paramètre de ligne de commande%~n0
pour obtenir le nom du fichier de commandes.%~n0_log.txt
Voici la séquence de commandes:
^> %~n0_temp.txt 2^>^&1
^& type %~n0_temp.txt ^>^> %~n0_log.txt
^& type %~n0_temp.txt
^& del /Q /F %~n0_temp.txt
Voici l'exemple:
set _Temp_Msg_Cmd= ^> %~n0_temp.txt 2^>^&1 ^& type %~n0_temp.txt ^>^> %~n0_log.txt ^& type %~n0_temp.txt ^& del /Q /F %~n0_temp.txt
De cette façon, la commande peut simplement être ajoutée après des commandes ultérieures dans un fichier de commandes qui semble beaucoup plus propre:
echo test message %_Temp_Msg_Cmd%
Cela peut également être ajouté à la fin d'autres commandes. Pour autant que je sache, cela fonctionnera lorsque les messages auront plusieurs lignes. Par exemple, la commande suivante génère deux lignes en cas de message d'erreur:
net use M: /D /Y %_Temp_Msg_Cmd%
la source
Cela va créer un fichier journal avec le datetime actuel et vous pouvez les lignes de console pendant le processus
la source
J'utilise un sous-programme batch avec une instruction "for" pour obtenir la sortie de la commande une ligne à la fois et à la fois écrire cette ligne dans un fichier et la sortir sur la console.
la source
Si vous êtes sur la CLI, pourquoi ne pas utiliser une boucle FOR pour "FAIRE" tout ce que vous voulez:
Grande ressource sur Windows CMD pour les boucles: https://ss64.com/nt/for_cmd.html La clé ici est de définir les délimètres (délimitations), qui briseraient chaque ligne de sortie, à rien. De cette façon, il ne se cassera pas sur la valeur par défaut de l'espace blanc. Le% a est une lettre arbitraire, mais il est utilisé dans la section "faire" pour, eh bien ... faire quelque chose avec les caractères qui ont été analysés à chaque ligne. Dans ce cas, nous pouvons utiliser les esperluettes (&&) pour exécuter la 2e commande echo pour créer ou ajouter (>>) à un fichier de notre choix. Plus sûr de conserver cet ordre de commandes DO en cas de problème d'écriture du fichier, nous aurons au moins l'écho sur la console en premier. Le signe at (@) devant le premier écho empêche la console d'afficher la commande écho elle-même et affiche simplement le résultat de la commande qui consiste à afficher les caractères dans% a. Sinon, vous verriez:
MISE À JOUR: / F ignore les lignes vides et le seul correctif consiste à pré-filtrer la sortie en ajoutant un caractère à chaque ligne (peut-être avec des numéros de ligne via la commande find). Résoudre cela dans CLI n'est pas rapide ou joli. De plus, je n'ai pas inclus STDERR, alors voici également les erreurs de capture:
Redirection des messages d'erreur
Les carets (^) sont là pour échapper aux symboles après eux, car la commande est une chaîne qui est interprétée, par opposition à dire, la saisir directement sur la ligne de commande.
la source
Tout comme unix.
dir | tee a.txt
Fonctionne sous Windows XP, il nécessite
mksnt
installé.Il s'affiche à l'invite et s'ajoute au fichier.
la source
La suite est utile si vous voulez que quelque chose soit vraiment visible à l'écran - même si le fichier de commandes a été redirigé vers un fichier. Le périphérique CON peut également être utilisé s'il est redirigé vers un fichier
Exemple:
Voir également une bonne description de la redirection: http://www.p-dd.com/chapter7-page14.html
la source
Vous pouvez trouver ces commandes dans le biterscripting ( http://www.biterscripting.com ) utiles.
la source
Cela fonctionne en temps réel mais est également très laid et les performances sont lentes. Pas bien testé non plus:
la source
%MYCOMMAND%
fin et il échoue dans de nombreux cas. Il saute les lignes vides, les lignes commençant par;
défaut avec un contenu comme<space>/<TAB>
,ON
,OFF
ou/?
. Mais le reste pourrait parfois fonctionner :-)Une alternative est de té stdout à stderr dans votre programme:
en java:
Ensuite, dans votre fichier batch:
java program > log.txt
Le stdout ira au fichier journal et le stderr (mêmes données) s'affichera sur la console.
la source
J'installe perl sur la plupart de mes machines donc une réponse en utilisant perl: tee.pl
dir | perl tee.pl ou dir | perl tee.pl dir.bat
brut et non testé.
la source
Une autre variante consiste à diviser le tuyau, puis à rediriger la sortie comme vous le souhaitez.
Enregistrez ce qui précède dans un fichier .bat. Il divise également la sortie texte de filestream 1 en filestream 3, que vous pouvez rediriger si nécessaire. Dans mes exemples ci-dessous, j'ai appelé le script ci-dessus splitPipe.bat ...
la source
c:\cygwin64\bin\script.exe
et entrezcmd
et entrezexit
et entrez (quitte Cygwin's cmd.exe)exit
et entrez (quitte le script.exe de Cygwin)la source