Как запустить консольный процесс и применить пользовательский заголовок, используя Powershell
Я преобразовываю старую команду cmd
в Powershell и в настоящее время использую:
START "My Title" Path/To/ConsoleApp.exe
Это работает, как ожидается, для запуска ConsoleApp с My Title в качестве заголовка окна. Это было заменено Start-Process, который работает правильно, но не предоставляет механизм для изменения названия.
Есть ли другой способ сделать это, не прибегая к использованию команды cmd
?
Ответы
Ответ 1
При изменении основного текста процесса возникает небольшая причуда: если вы попытаетесь изменить текст сразу после запуска процесса, он может выйти из строя из-за одной из многих возможных причин (например, дескриптор контроль, который отображает текст, не существует во время вызова функции). Таким образом, решение заключается в использовании метода WaitForInputIdle()
, прежде чем пытаться изменить текст:
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
Я пробовал это с cmd.exe, и он работал хорошо.
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
$host.UI.RawUI.Windowtitle= "новое название"
Как уже было сказано Джорджем, все или любой может установить его обратно (например, пользовательские функции приглашения).
Ответ 4
Если вы хотите создать процесс с помощью powershell с настраиваемым заголовком, попробуйте:
$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)
Обратите внимание на могильные символы, которые выходят за строку для названия, они жизненно важны!