Determinar si la salida estándar está redirigida

3140 vistas

A veces es útil saber si la ejecución de una aplicación cónsola redirige o no sus entradas/salidas estándars. Para determinar si es el caso, vamos a usar la función Getfiletype que devuelve el tipo del fichero del handle pasado por parámetro:



delphi
  1. program TestIO;
  2. {$APPTYPE CONSOLE}
  3. uses sysutils, Windows;
  4.  
  5. var
  6.   ConsoleHandle : THandle;
  7.  
  8. Function GetHandleType(Handle:THandle): String;
  9. begin
  10.   case GetFileType(Handle)of
  11.   FILE_TYPE_UNKNOWN : Result:='tipo desconocido o error.';
  12.   FILE_TYPE_DISK    : Result:='fichero disco.';
  13.   FILE_TYPE_CHAR    : Result:='fichero carácter.';
  14.   FILE_TYPE_PIPE    : Result:='socket, una pipe con nombre, o una pipe anónima.';
  15.   //FILE_TYPE_REMOTE no usado
  16.   end;
  17. end;
  18.  
  19. begin
  20.   ConsoleHandle := GetStdHandle(STD_OUTPUT_HANDLE);
  21.   WriteLn('Salida estándard : '+ GetHandleType(ConsoleHandle));
  22.   Readln;
  23.   ConsoleHandle := GetStdHandle(STD_INPUT_HANDLE);
  24.   WriteLn('Entrada estándard : '+ GetHandleType(ConsoleHandle));
  25. end.



El tipo devuelto puede ser:
FILE_TYPE_CHAR : indica un tipo de fichero carácter, normalmente una impresora o la cónsola.
FILE_TYPE_DISK : indica un tipo de fichero disco.
FILE_TYPE_PIPE : indica un tipo de fichero socket, una pipe con nombre, o pipe anónima.
FILE_TYPE_REMOTE : no se usa
FILE_TYPE_UNKNOWN : si el tipo de fichero es desconocido o si la función a fallado.

El script siguiente permite visualizar los diferentes casos:



delphi
  1. @Echo Off
  2. Set DirPrgName=
  3. Set PrgName=%DirPrgName%TestIO.exe
  4.  
  5. Rem diferentes casos
  6. Echo Test con : %PrgName%
  7. %PrgName%
  8. pause&Echo.
  9.  
  10. Echo Test con : %PrgName%^>Result1.txt
  11. %PrgName%>Result1.txt
  12. Type Result1.txt
  13. pause&Echo.
  14.  
  15. Echo Test con : %PrgName%^|more
  16. %PrgName%|more
  17. pause&Echo.
  18.  
  19. Echo Test con : %PrgName%^|more^>Result2.txt
  20. %PrgName%|more>Result2.txt
  21. Type Result2.txt
  22. pause&Echo.
  23.  
  24. Echo Test con : %PrgName%^>Result1.txt
  25. %PrgName%<Result1.txt
  26. pause&Echo.
  27.  
  28. Echo Test con : %PrgName%^<Result1.txt^>Result3.txt
  29. %PrgName%<Result1.txt>Result3.txt
  30. Type Result3.txt
  31. pause&Echo.