Je crée un fichier de commandes avec quelques commandes simples pour collecter des informations à partir d'un système. Le fichier de commandes contient des commandes pour obtenir l'heure, les informations IP, les utilisateurs, etc.
J'ai assemblé toutes les commandes dans un fichier de commandes, et il s'exécute, mais j'aimerais que le fichier de commandes, lorsqu'il est exécuté, produise les résultats dans un fichier texte (journal). Y at-il une commande que je peux ajouter au lot qui le ferait?
N'oubliez pas que je ne veux pas exécuter le lot à partir de cmd, puis rediriger la sortie. Je souhaite rediriger la sortie de l'intérieur du lot, si cela est possible.
La méthode naïve simple qui est lente car elle ouvre et positionne le pointeur de fichier sur End-Of-File plusieurs fois.
@echo off
command1 >output.txt
command2 >>output.txt
...
commandN >>output.txt
Une meilleure solution - plus facile à écrire et plus rapide car le fichier n’est ouvert et positionné qu’une seule fois.
@echo off
>output.txt (
command1
command2
...
commandN
)
Un autre moyen rapide et efficace d’ouvrir et de positionner le fichier une seule fois
@echo off
call :sub >output.txt
exit /b
:sub
command1
command2
...
commandN
si vous voulez les deux flux sortants et redirigés
dir >> a.txt 2>&1
Je sais que ceci est un article plus ancien, mais quelqu'un le trouvera dans une recherche Google. Il semble également que certaines questions posées par le PO dans les commentaires n'aient pas été spécifiquement abordées. Aussi, s'il vous plaît, allez-y doucement car c'est ma première réponse postée sur SO. :)
Pour rediriger la sortie vers un fichier en utilisant un nom de fichier généré dynamiquement, mon approche de référence (lecture: rapide et sale) est la deuxième solution proposée par @dbenham. Donc, par exemple, ceci:
@echo off
> filename_prefix-%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log (
echo Your Name Here
echo Beginning Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
REM do some stuff here
echo Your Name Here
echo Ending Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
)
Crée un fichier semblable à ce que vous voyez dans ce capture d'écran du fichier dans le répertoire cible
Cela contiendra cette sortie:
Your Name Here
Beginning Date/Time: 2016-09-16_141048.log
Your Name Here
Ending Date/Time: 2016-09-16_141048.log
N'oubliez pas non plus que cette solution dépend des paramètres régionaux, soyez donc prudent avec son utilisation.
@echo off
>output.txt (
echo Checking your system infor, Please wating...
systeminfo | findstr /c:"Host Name"
systeminfo | findstr /c:"Domain"
ipconfig /all | find "Physical Address"
ipconfig | find "IPv4"
ipconfig | find "Default Gateway"
)
@pause
echo some output >"your logfile"
ou
(
echo some output
echo more output
)>"Your logfile"
devrait remplir la facture.
Si vous voulez APPEND
la sortie, utilisez >>
au lieu de >
. >
va démarrer un nouveau fichier de log.
Il existe un petit programme intéressant que vous pouvez utiliser pour rediriger la sortie vers un fichier et la console
some_command ^| TEE.BAT [ -a ] filename
@ECHO OFF
:: Check Windows version
IF NOT "%OS%"=="Windows_NT" GOTO Syntax
:: Keep variables local
SETLOCAL
:: Check command line arguments
SET Append=0
IF /I [%1]==[-a] (
SET Append=1
SHIFT
)
IF [%1]==[] GOTO Syntax
IF NOT [%2]==[] GOTO Syntax
:: Test for invalid wildcards
SET Counter=0
FOR /F %%A IN ('DIR /A /B %1 2^>NUL') DO CALL :Count "%%~fA"
IF %Counter% GTR 1 (
SET Counter=
GOTO Syntax
)
:: A valid filename seems to have been specified
SET File=%1
:: Check if a directory with the specified name exists
DIR /AD %File% >NUL 2>NUL
IF NOT ERRORLEVEL 1 (
SET File=
GOTO Syntax
)
:: Specify /Y switch for Windows 2000 / XP COPY command
SET Y=
VER | FIND "Windows NT" > NUL
IF ERRORLEVEL 1 SET Y=/Y
:: Flush existing file or create new one if -a wasn't specified
IF %Append%==0 (COPY %Y% NUL %File% > NUL 2>&1)
:: Actual TEE
FOR /F "tokens=1* delims=]" %%A IN ('FIND /N /V ""') DO (
> CON ECHO.%%B
>> %File% ECHO.%%B
)
:: Done
ENDLOCAL
GOTO:EOF
:Count
SET /A Counter += 1
SET File=%1
GOTO:EOF
:Syntax
ECHO.
ECHO Tee.bat, Version 2.11a for Windows NT 4 / 2000 / XP
ECHO Display text on screen and redirect it to a file simultaneously
ECHO.
IF NOT "%OS%"=="Windows_NT" ECHO Usage: some_command ³ TEE.BAT [ -a ] filename
IF NOT "%OS%"=="Windows_NT" GOTO Skip
ECHO Usage: some_command ^| TEE.BAT [ -a ] filename
:Skip
ECHO.
ECHO Where: "some_command" is the command whose output should be redirected
ECHO "filename" is the file the output should be redirected to
ECHO -a appends the output of the command to the file,
ECHO rather than overwriting the file
ECHO.
ECHO Written by Rob van der Woude
ECHO http://www.robvanderwoude.com
ECHO Modified by Kees Couprie
ECHO http://kees.couprie.org
ECHO and Andrew Cameron
@echo OFF
[your command] >> [Your log file name].txt
J'ai utilisé la commande ci-dessus dans mon fichier de commandes et cela fonctionne. Dans le fichier journal, il affiche les résultats de ma commande.
Ajoutez ces deux lignes vers le haut de votre fichier de commandes, tous les stdout et stderr suivants seront redirigés vers log.txt:
if not "%1"=="STDOUT_TO_FILE" %0 STDOUT_TO_FILE %* >log.txt 2>&1
shift /1
Cela peut échouer dans le cas de caractères "toxiques" dans l'entrée. Considérer une contribution comme celle-ci est un bon moyen de comprendre ce qui se passe. Bien sûr, il existe une règle selon laquelle une chaîne d'entrée DOIT être entre guillemets mais je pense que cette règle est une règle valide uniquement si la signification de l'entrée est un emplacement sur une partition NTFS (peut-être est-il une règle pour les URL suis pas sûr). Mais ce n'est pas une règle pour une chaîne d'entrée arbitraire bien sûr (c'est "une bonne pratique" mais vous ne pouvez pas compter avec elle).