Cómo iniciar un proceso basado en la consola y aplicar un título personalizado mediante Powershell

StackOverflow https://stackoverflow.com/questions/3155101

  •  01-10-2019
  •  | 
  •  

Pregunta

Estoy convirtiendo un viejo comando cmd a Powershell y uso actualmente:

START "My Title" Path/To/ConsoleApp.exe

Este funciona como espera lanzar ConsoleApp con mi título, ya que de título de la ventana. Esto ha sido reemplazado con Start-proceso que funciona correctamente, pero no proporciona un mecanismo para cambiar el título.

¿Hay otra manera de hacer esto sin de recurrir a usar el comando cmd?

¿Fue útil?

Solución

Hay un pequeño capricho al cambiar el texto del proceso de ventana principal: si se intenta cambiar el texto inmediatamente después de que haya comenzado el proceso, puede fallar debido a una de las muchas razones posibles (por ejemplo, el identificador de la control que muestra que no existe el texto en el momento de la llamada de función). Así que la solución es utilizar el método WaitForInputIdle() antes de intentar cambiar el texto:

Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;

public static class Win32Api
{
    [DllImport("User32.dll", EntryPoint = "SetWindowText")]
    public static extern int SetWindowText(IntPtr hWnd, string text);
}
"@

$process = Start-Process -FilePath "notepad.exe" -PassThru
$process.WaitForInputIdle()
[Win32Api]::SetWindowText($process.MainWindowHandle, "My Custom Text")

Tenga en cuenta que la aplicación en sí todavía puede cambiar el texto de la ventana después de que haya hecho su propio cambio.

Otros consejos

He intentado esto con cmd.exe y funcionó bien.

Add-Type -Type @"
using System;
using System.Runtime.InteropServices;
namespace WT {
   public class Temp {
      [DllImport("user32.dll")]
      public static extern bool SetWindowText(IntPtr hWnd, string lpString); 
   }
}
"@

$cmd = Start-Process cmd -PassThru
[wt.temp]::SetWindowText($cmd.MainWindowHandle, 'some text')

$ host.UI.RawUI.WindowTitle = "nuevo título"

Como ya se ha dicho por George, nada / nadie puede establecer de nuevo (como funciones de mensajes personalizados, por ejemplo).

Si desea generar un proceso con PowerShell con un try título personalizado:

$StartInfo = new-object System.Diagnostics.ProcessStartInfo
$StartInfo.FileName = "$pshome\powershell.exe"
$StartInfo.Arguments = "-NoExit -Command `$Host.UI.RawUI.WindowTitle=`'Your Title Here`'"
[System.Diagnostics.Process]::Start($StartInfo)

Tenga en cuenta los caracteres graves que se escapan a la cadena por el título, que son vitales!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top