2010-07-01 10 views
10

sto trasformare una vecchia comando cmd a PowerShell e attualmente in uso:Come avviare un processo di console-based e applicare un titolo personalizzato utilizzando Powershell

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

Questo funziona come previsto per il lancio ConsoleApp con mio titolo come è il titolo della finestra. Questo è stato sostituito con Start-Process che funziona correttamente, ma non fornisce un meccanismo per modificare il titolo.

C'è un altro modo per fare questo senza ricorrere all'utilizzo del comando cmd?

+0

Qualcuna delle soluzioni ha funzionato per te? Per le mie applicazioni non-gui non funziona come WaitForInputIdle non riesce a funzionare (vedi errore nei commenti delle risposte di seguito). – gdelfino

risposta

9

C'è un piccolo capriccio quando si cambia il testo del processo di finestra principale: se si tenta di cambiare il testo subito dopo aver avviato il processo, potrebbe non riuscire a causa di una delle tante possibili ragioni (ad esempio l'handle per il controllo che visualizza il testo non esiste al momento della chiamata della funzione). Quindi la soluzione è quella di utilizzare il metodo WaitForInputIdle() prima di provare a modificare il testo:

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") 

essere consapevoli del fatto che l'applicazione stessa può ancora cambiare il testo della finestra dopo aver effettuato il proprio cambiamento.

+2

Questo non funziona per me, almeno non per 'CMD.EXE' come processo in questione (come specificato dall'OP). 'WaitForInputIdle()' genera una 'InvalidOperationException' per le app non-GUI e' MainWindowHandle' è '0' per le app non-GUI. –

+0

Sfortunatamente, questo non funziona per me. Ho bisogno di eseguire un'applicazione non-gui e ottengo questo errore: Eccezione chiama "WaitForInputIdle" con "0" argomento (s): ". WaitForInputIdle fallita Questo potrebbe essere perché il processo non ha un'interfaccia grafica" – gdelfino

5

Ho provato questo con cmd.exe e ha funzionato bene.

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

Nel mio script della linea "[wt.temp] :: SetWindowText ($ cmd.MainWindowHandle, 'del testo')" a volte restituisce True, e sometimas False, ma non è mai imposta il titolo della mia candidatura non GUI. – gdelfino

+0

Ora funziona! Non so davvero cosa sia cambiato. Forse ho solo bisogno di riavviare il mio PowerShell. Grazie per aver fornito questo codice. – gdelfino

+2

Questa soluzione funziona non sempre funziona per me. Ho aggiunto un ritardo (Start-Sleep -s-5) prima di provare a impostare il titolo della finestra e ora sembra funzionare in modo più affidabile. – gdelfino

1

$ host.UI.RawUI.WindowTitle = "nuovo titolo"

Come già stato detto da George, niente/chiunque può impostare indietro (come le funzioni di prompt personalizzati per esempio).

+0

Perfetto! Molto più semplice delle altre soluzioni. Non so il motivo per cui non ha nessun upvotes ... –

0

Se si vuole generare un processo con PowerShell con un titolo personalizzato prova:

$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 i caratteri gravi che sfuggono la stringa per il titolo, sono di vitale importanza!