Uso de un comando Tee personalizado para el archivo .bat

Intento utilizar el código de salida escrito para un archivo bat pero estoy teniendo problemas para implementarlo en mi código. No quiero utilizar ninguna instalación de terceros para resolver el problema de salida, ya que quiero que el código funcione si formateo mi computadora en un año y quiero ejecutar el progtwig nuevamente.

Lo tengo configurado de esta manera:

mycommand.exe | tee.bat -a output.txt 

He intentado con un archivo .bat separado e intenté incluir como una función (preffered) en el .bat original sin éxito con:

 myprogram.exe | call tee -a output.txt echo. echo. echo. SET /P restart="Do you want to run again? (1=yes, 2=no): " if "%restart%"=="1" GOTO LoopStart ::-------------------------------------------------------- ::-- Function section starts below here ::-------------------------------------------------------- :tee :: 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 tratando de dividir el resultado para poder guardar la salida de la consola en un archivo mientras aún puedo interactuar con el progtwig que se está ejecutando.

¿Cómo puedo hacer que el comando Tee funcione correctamente con mi .bat para poder dividir el resultado tanto en un archivo como en la consola?

Su bash de llamar a una función de proceso por lotes dentro de una tubería siempre fallará debido a la forma en que funcionan las tuberías de Windows: Windows crea una instancia de ambos lados de la tubería a través de nuevas cubiertas de CMD. Consulte https://stackoverflow.com/a/8194279/1012053 para obtener más información.

Esa versión de Rob van der Woude de un tee de lotes no puede funcionar para ti porque usa un FOR /F para leer los resultados de un comando: el comando debe ejecutarse hasta su finalización antes de que se lean las líneas. Eso no funcionará si necesita la interacción del usuario durante la ejecución del comando. Con esa versión de tee, también podría simplemente redirigir la salida a un archivo y luego TYPE el archivo cuando haya terminado. Obviamente no es lo que quieres.

Existen trucos de lotes puros que pueden acercarte más, pero creo que todavía hay un problema que no se puede resolver con lotes puros. Su ejecutable puede poner un aviso en una línea sin emitir una nueva línea. Creo que el lote nativo puro siempre lee líneas enteras (excepto cuando está al final de la secuencia). No conozco un método por lotes para leer carácter por carácter.

Corrección leve : SET /P puede leer líneas parciales de entrada canalizada, pero tiene limitaciones que evitan que se use para una solución sólida de Tone Batch: no hay forma de saber con certeza cuándo termina cada línea. Está limitado a 1021 caracteres por “línea”. Despoja a los personajes de control del final de cada “línea”. No hay forma de saber cuándo ha llegado al final de la secuencia de entrada.

Pero hay una solución simple: JScript o VBScript funciona como un campeón, y no requiere ninguna instalación especial. Aquí hay una secuencia de comandos híbrida de JScript / por lotes que debería funcionar para usted. El JScript está mal escrito con mucho margen de mejora. Por ejemplo, no hay comprobación de errores.

tee.bat el script como tee.bat . El primer argumento requerido especifica el nombre del archivo para escribir. De manera predeterminada, el archivo está sobrescrito si ya existe. Si se proporciona un segundo argumento (el valor no importa), el resultado se agrega al archivo en su lugar.

 @if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment ::--- Batch section within JScript comment that calls the internal JScript ---- @echo off cscript //E:JScript //nologo "%~f0" %* exit /b ----- End of JScript comment, beginning of normal JScript ------------------*/ var fso = new ActiveXObject("Scripting.FileSystemObject"); var mode=2; if (WScript.Arguments.Count()==2) {mode=8;} var out = fso.OpenTextFile(WScript.Arguments(0),mode,true); var chr; while( !WScript.StdIn.AtEndOfStream ) { chr=WScript.StdIn.Read(1); WScript.StdOut.Write(chr); out.Write(chr); } 

El uso es bastante parecido al que esperarías.

 command.exe | tee.bat output.txt 1 

El último argumento 1 fuerza el modo de agregar. Podría ser cualquier valor además de 1

Es posible poner todo en un script por lotes como parezca preferir.

 @if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment ::--- Batch section within JScript comment ---------------------------- @echo off ::This block of code handles the TEE by calling the internal JScript code if "%~1"=="_TEE_" ( cscript //E:JScript //nologo "%~f0" %2 %3 exit /b ) ::The rest of your batch script goes here ::This pipes to TEE in append mode mycommand.exe | "%~f0" _TEE_ output.txt 1 exit /b ----- End of JScript comment, beginning of normal JScript ------------------*/ var fso = new ActiveXObject("Scripting.FileSystemObject"); var mode=2; if (WScript.Arguments.Count()==2) {mode=8;} var out = fso.OpenTextFile(WScript.Arguments(0),mode,true); var chr; while( !WScript.StdIn.AtEndOfStream ) { chr=WScript.StdIn.Read(1); WScript.StdOut.Write(chr); out.Write(chr); } 

Actualizar

Para cualquiera que tenga un interés académico en la creación de secuencias de comandos por lotes, he publicado una versión de lote nativa pura de tee en el script de tee por lotes asincrónico nativo en DosTips. Pero este enfoque híbrido es mi solución de scripting preferida.