Je convertissez une ancienne commande code> cmd code> à PowerShell, et utilisez actuellement: 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. P> existe une autre façon de faire cela sans em> recourir à l'utilisation de < code> CMD code> commande? p> p>
4 Réponses :
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')
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.
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")
Cela ne fonctionne pas pour moi, du moins pas pour cmd.exe code> comme processus en question (comme spécifié par OP). WaitForinPutiveDle () Code> lève un InvalidOperationException Code> Pour les applications non guignoires et Mainwindowhandle code> est 0 code> 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."
$ host.ui.rawui.windowtitle = "nouveau titre" p>
Comme déjà dit par George, tout ce qui peut le régler (comme des fonctions d'invite personnalisées par exemple). P>
Parfait! Tellement plus simple que les autres solutions. Je ne sais pas pourquoi il n'a pas de upvotes ...
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)
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).