Come avviare un processo di console-based e applicare un titolo personalizzato utilizzando Powershell

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

  •  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?

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top