Come avviare un processo di console-based e applicare un titolo personalizzato utilizzando Powershell
-
01-10-2019 - |
Domanda
sto trasformare una vecchia comando cmd
a PowerShell e attualmente uso:
START "My Title" Path/To/ConsoleApp.exe
Questo funziona come previsto per lanciare ConsoleApp con mio titolo come del titolo della finestra. Questo è stato sostituito con sistema Start-Process, che funziona correttamente, ma non fornisce un meccanismo per cambiare il titolo.
C'è un altro modo per fare questo senza ricorrere a usando il comando cmd
?
Soluzione
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, la maniglia per il controllo che visualizza il testo non esiste al momento della chiamata di funzione). Quindi la soluzione è quella di utilizzare il metodo WaitForInputIdle()
prima di provare a cambiare 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")
Si tenga presente che l'applicazione stessa può ancora cambiare il testo della finestra dopo aver effettuato il proprio cambiamento.
Altri suggerimenti
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')
$ host.UI.RawUI.WindowTitle = "nuovo titolo"
Come già detto da George, niente / chiunque può impostare indietro (come le funzioni di prompt personalizzati, ad esempio).
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)
Si noti personaggi gravi che sfuggono la stringa per il titolo, sono di vitale importanza!