Подтвердить что ты не робот

Как запустить консольный процесс и применить пользовательский заголовок, используя Powershell

Я преобразовываю старую команду cmd в Powershell и в настоящее время использую:

START "My Title" Path/To/ConsoleApp.exe

Это работает, как ожидается, для запуска ConsoleApp с My Title в качестве заголовка окна. Это было заменено Start-Process, который работает правильно, но не предоставляет механизм для изменения названия.

Есть ли другой способ сделать это, не прибегая к использованию команды cmd?

4b9b3361

Ответ 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)

Обратите внимание на могильные символы, которые выходят за строку для названия, они жизненно важны!