2012-07-20 22 views
5

Tengo una herramienta de línea de comandos que normalmente tira alrededor de 200 líneas de salida. Estoy buscando texto que aparece al final de esta salida. Cuando vuelvo a dirigir la salida a un archivo:El comando de DOS redirecciona al archivo trunca la salida

C:\> somecommand > results.txt 2>&1 

... sólo los primeros 100 o más líneas de salida se muestra en este archivo. Del mismo modo, si canalizo la salida en algo así como 'findstr', el programa receptor no puede encontrar u operar en ningún texto después de aproximadamente la 100ma línea.

La configuración del tamaño del búfer de pantalla para el shell parece no tener ningún efecto en el número de líneas que se pueden capturar.

¿Alguna idea de lo que está pasando aquí? Por lo que vale, el comando en cuestión es iscmdbld.exe de InstallShield 2012.

Este problema no ocurre con otros comandos que he probado (como 'dir').

La salida completa del programa solo se puede ver al ejecutar el comando dentro de una ventana de cmd.

+0

probar el cambio de dirección en la salida, por si acaso el comando está tratando como un parámetro - '> results.txt 2> & 1 somecommand' – SeanC

+0

Trate Añadiendo la salida: C: \> algúncomando >> results.txt 2> & 1 – DogLimbo

+0

Tengo el mismo programa con mi propio proyecto de Visual C++. La salida de mi programa se trunca cuando se redirige a un archivo. – Notinlist

Respuesta

0

Otra pega es agregar ('>>') en lugar de empezar de nuevo ('>'). Sin embargo, no puedo pensar cómo generar lo que estás viendo sin saber más sobre tu problema.

+0

Error al producir un programa de reproducción pequeño. El efecto original está en su lugar en la situación original. Agregando más información a mi caso en el comentario de la pregunta. – Notinlist

1

En caso de que está escribiendo a otra corriente, intente esto:

somecommand > results.txt 2>&1 3>&1 4>&1 5>&1 6>&1 7>&1 8>&1 9>&1 

La otra posibilidad es que la herramienta es el uso de pantalla directo escribe para parte de la salida - en días MSDOS de lectura de pantalla había TSR programas que pueden ayudar.

2

Bueno, desafortunadamente no tengo instalado InstallShield, así que será bastante difícil para mí realizar algunas pruebas, pero tengo cámaras en todos los programas que no funcionan como se supone que deben hacer cuando se trata de manejar entradas y salidas. En un caso normal ">" no debería tener límite, lo estoy usando mucho en un servidor de Windows que ejecuta ghostscript y otros programas viejos de segundo plano en el fondo y la única forma de canalizar la salida a un archivo es usar> , a veces tengo archivos de unos pocos Mb, por lo que las 200 líneas realmente tienen que hacer algo con el actual.

Solo puedo sugerir probar alguna solución, por ejemplo, puedes probar tee32, es un pequeño freeware que capturará todos los dos resultados de la pantalla en un archivo. Entonces verá la salida en la pantalla y también la tendrá en el archivo.

Puede leer mas sobre esto: here lamentablemente los enlaces mencionados en la página no están trabajando, pero yo era capaz de encontrar una copia de trabajo de la misma: here

Realmente espero que esto le ayudará a superar el problema .

Emil

+0

El problema fue muy complicado. Mi programa terminó de mala pero aparentemente buena manera. No hay nada de malo (Win 7 64 bits) con la redirección de la consola. Pero me gustó mucho esta respuesta ya que da paso a problemas de depuración como este. – Notinlist

+1

Gracias. Empecé a usar computadoras con MS-DOS 5.0 y Windows 3.0 cuando tenía 8-10, y de alguna manera DOS y todas las soluciones pequeñas (limitaciones) (como 640kb de RAM) siguen siendo el tema favorito, tenía su propia magia y todavía pienso El DOS tiene una sensación interesante de que nunca entrarás en LINUX, ni en ningún Windows elegante. –

1

Una solución alternativa al problema podría ser la construcción de un programa de C# que captura la salida y la envía a un archivo.

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace CaptureCMDOutput 
{ 
    class Program 
    { 
     static string _Filename = @"sc.exe"; 
     static string _Arguments = @"query"; 
     static string _outputfile = @"c:\debug.txt"; 

     static void Main(string[] args) 
     { 
      var processStartInfo = new ProcessStartInfo 
      { 
       FileName = _Filename, // Exe file to run 
       Arguments = _Arguments, // Arguments to exe file 
       RedirectStandardOutput = true, 
       UseShellExecute = false 
      }; 

      var process = Process.Start(processStartInfo); 
      process.OutputDataReceived += process_OutputDataReceived; 
      process.BeginOutputReadLine(); 
      process.WaitForExit(); 
      process.CancelOutputRead(); 

      Console.ReadKey(); 
     } 

     static void process_OutputDataReceived(object sender, DataReceivedEventArgs e) 
     { 
      Console.WriteLine(e.Data); 

      using (StreamWriter writer = new StreamWriter(_outputfile, true)) 
      { 
       writer.WriteLine(e.Data); 
      } 
     } 


    } 
} 
Cuestiones relacionadas