Как начать консольный процесс и примените пользовательский заголовок с использованием PowerShell

StackOverflow https://stackoverflow.com/questions/3155101

  •  01-10-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Помните, что сам приложение все равно может изменить текст окна после того, как вы сделали свои собственные изменения.

Другие советы

Я попробовал это с 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')

$ host.ui.rawui.windowtitle = "Новый титул"

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

Если вы хотите вызвать процесс с PowerShell с пользовательским названием TRY:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top