windows - tuberias - Redirigir la salida desde dentro del archivo por lotes
pipes en linux (6)
Hay un pequeño programa genial que puede usar para redirigir la salida a un archivo y la consola
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
Estoy creando un archivo por lotes con algunos comandos simples para recopilar información de un sistema. El archivo por lotes contiene comandos para obtener la hora, información de IP, usuarios, etc.
Reuní todos los comandos en un archivo de proceso por lotes, y se ejecuta, pero me gustaría que el archivo por lotes, cuando se ejecutara, genere los resultados en un archivo de texto (registro). ¿Hay algún comando que pueda agregar al lote que lo haga?
Tenga en cuenta que no quiero ejecutar el lote desde cmd, luego redirijo la salida; Quiero redirigir la salida desde dentro del lote, si eso es posible.
La manera ingenua simple (menos eficiente)
@echo off
command1 >output.txt
command2 >>output.txt
...
commandN >>output.txt
Una mejor manera: más fácil de escribir y más rápido.
@echo off
>output.txt (
command1
command2
...
commandN
)
Otra buena forma
@echo off
call :sub >output.txt
exit /b
:sub
command1
command2
...
commandN
Sé que esta es una publicación más antigua, pero alguien se encontrará con ella en una búsqueda en Google y también parece que algunas preguntas que el OP hizo en los comentarios no fueron abordadas específicamente. Además, por favor, trátame, ya que esta es mi primera respuesta publicada en SO. :)
Para redirigir el resultado a un archivo usando un nombre de archivo generado dinámicamente, mi enfoque go-to (leer: rápido y sucio) es la segunda solución ofrecida por @dbenham. Entonces, por ejemplo, esto:
@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
)
Creará un archivo como el que ve en esta captura de pantalla del archivo en el directorio de destino
Eso contendrá este resultado:
Your Name Here
Beginning Date/Time: 2016-09-16_141048.log
Your Name Here
Ending Date/Time: 2016-09-16_141048.log
También tenga en cuenta que esta solución depende de la configuración regional, así que tenga cuidado de cómo y cuándo la usa.
si quieres redireccionar tanto las corrientes de salida como las de errar
dir >> a.txt 2>&1
@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"
o
(
echo some output
echo more output
)>"Your logfile"
debe llenar la factura.
Si desea APPEND
la salida, use >>
lugar de >
. >
comenzará un nuevo archivo de registro.