11
votes

Comment démarrer un processus basé sur la console et appliquer un titre personnalisé à l'aide de PowerShell

Je convertissez une ancienne commande cmd à PowerShell, et utilisez actuellement: xxx

Ceci fonctionne comme prévu pour lancer consoleApp avec mon titre en tant que titre de la fenêtre. Cela a été remplacé par le processus de démarrage qui fonctionne correctement, mais ne fournit pas de mécanisme pour modifier le titre.

existe une autre façon de faire cela sans recourir à l'utilisation de < code> CMD commande?


1 commentaires

Est-ce que l'une des solutions a fonctionné pour vous? Pour mes applications non-GUI, il ne fonctionne pas comme WaitForinPutiveDle ne fonctionne pas (voir erreur dans les réponses des commentaires ci-dessous).


4 Réponses :


5
votes

J'ai essayé cela avec cmd.exe et ça a bien fonctionné.

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


3 commentaires

Dans mon script, la ligne "[wt.temp] :: setwindowtext ($ cmd.mainwindowhandle," un peu de texte ")" retourne parfois vrai, et quelque chose de faux, mais il ne règle jamais le titre de mon application non-GUI.


Ça marche maintenant! Je ne sais pas vraiment ce qui a changé. Peut-être que j'ai juste besoin de redémarrer mon PowerShell. Merci d'avoir fourni ce code.


Cette solution ne fonctionne pas toujours pour moi. J'ai ajouté un retard (démarrage-sommeil -s 5) avant d'essayer de définir le titre de la fenêtre et semble maintenant fonctionner de manière plus fiable.



11
votes

Il existe une petite quirk lors de la modification du texte de la fenêtre principale du processus: Si vous essayez de modifier le texte droit après avoir démarré le processus, cela peut échouer en raison de l'une des nombreuses raisons possibles (par exemple, la poignée à la Contrôle qui affiche le texte n'existe pas au moment de l'appel de la fonction). Donc la solution consiste à utiliser la méthode waitforinputidle () code> avant d'essayer de modifier le texte:

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


2 commentaires

Cela ne fonctionne pas pour moi, du moins pas pour cmd.exe comme processus en question (comme spécifié par OP). WaitForinPutiveDle () lève un InvalidOperationException Pour les applications non guignoires et Mainwindowhandle est 0 pour les applications non-GUI.


Malheureusement, cela ne fonctionne pas pour moi. Je dois exécuter une application non-GUI et je reçois cette erreur: exception appelant "waitforinputidle" avec "0" argument (s) "0": "WaitForinPutiveDle a échoué. Cela pourrait être dû au fait que le processus n'a pas d'interface graphique."



1
votes

$ host.ui.rawui.windowtitle = "nouveau titre"

Comme déjà dit par George, tout ce qui peut le régler (comme des fonctions d'invite personnalisées par exemple).


1 commentaires

Parfait! Tellement plus simple que les autres solutions. Je ne sais pas pourquoi il n'a pas de upvotes ...



1
votes

Si vous voulez apparaître un processus avec PowerShell avec un titre personnalisé Essayez:

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


0 commentaires