2010-07-01 17 views
10

Estoy convirtiendo un viejo comando cmd a Powershell, y en la actualidad utilizar:Cómo iniciar un proceso basado en la consola y aplicar un título personalizado mediante Powershell

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

Esto funciona como se espera poner en marcha ConsoleApp con mi título como es el título de la ventana. Esto ha sido reemplazado con Start-Process que funciona correctamente, pero no proporciona un mecanismo para cambiar el título.

¿Hay otra manera de hacer esto sin recurriendo al uso del comando cmd?

+0

¿Alguna de las soluciones funcionó para usted? Para mis aplicaciones no gui, no funciona porque WaitForInputIdle no funciona (ver error en las respuestas a los comentarios a continuación). – gdelfino

Respuesta

9

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 controlador del control que muestra el texto no existe en el momento de la llamada a la 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.

+2

Esto no funciona para mí, al menos no para 'CMD.EXE' como el proceso en cuestión (como lo especifica el OP). 'WaitForInputIdle()' genera una 'InvalidOperationException' para aplicaciones que no son de GUI y' MainWindowHandle' es '0' para aplicaciones que no son de GUI. –

+0

Desafortunadamente, esto no funciona para mí. Necesito ejecutar una aplicación no gui y aparece este error: Excepción llamando a "WaitForInputIdle" con "0" argumento (s): "WaitForInputIdle falló. Esto podría deberse a que el proceso no tiene una interfaz gráfica". – gdelfino

5

Intenté 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') 
+0

En mi script, la línea "[wt.temp] :: SetWindowText ($ cmd.MainWindowHandle, 'some text')" algunas veces devuelve True, y algunas veces es False, pero nunca establece el título de mi aplicación no GUI. – gdelfino

+0

¡Ahora está funcionando! Realmente no sé qué cambió. Tal vez solo necesitaba reiniciar mi Powershell. Gracias por proporcionar este código. – gdelfino

+2

Esta solución no funciona para mí. He agregado un retraso (Start-Sleep -s 5) antes de intentar establecer el título de la ventana y ahora parece funcionar de manera más confiable. – gdelfino

1

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

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

+0

¡Perfecto! Mucho más simple que las otras soluciones. No sé por qué no tiene ningún voto positivo ... –

0

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) 

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

Cuestiones relacionadas