Как запустить консольный процесс и применить пользовательский заголовок с помощью Powershell - PullRequest
11 голосов
/ 01 июля 2010

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 01 июля 2010

При изменении текста основного окна процесса возникает небольшая странность: если вы попытаетесь изменить текст сразу после запуска процесса, он может завершиться неудачей по одной из многих возможных причин (например, дескриптор элемент управления, который отображает текст, не существует во время вызова функции). Поэтому решение состоит в том, чтобы использовать метод 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")

Имейте в виду, что само приложение все еще может изменять текст окна после того, как вы внесли свои изменения.

5 голосов
/ 01 июля 2010

Я пробовал это с 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')
1 голос
/ 02 июля 2010

$ host.UI.RawUI.WindowTitle = "new title"

Как уже было сказано Джорджем, все / любой может его вернуть (например, функции пользовательских подсказок).

0 голосов
/ 24 ноября 2016

Если вы хотите создать процесс с 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)

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

...