Как начать консольный процесс и примените пользовательский заголовок с использованием PowerShell
-
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)
Обратите внимание на могильные символы, которые избегают строки для заголовка, они жизненно важны!