我正在将旧的cmd
命令转换为Powershell,目前正在使用:
START "My Title" Path/To/ConsoleApp.exe
这可以按预期使用My Title作为窗口标题启动ConsoleApp。这已经被正常工作的Start-Process取代,但没有提供更改标题的机制。
还有另一种方法可以在没有使用cmd
命令的情况下执行吗?
答案 0 :(得分:10)
更改进程主窗口的文本时有一个小怪癖:如果您在启动进程后尝试直接更改文本,则可能由于多种可能原因(例如,显示文本的控件在函数调用时不存在)。所以解决方案是在尝试更改文本之前使用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")
请注意,在您进行自己的更改后,应用程序本身仍然可以更改窗口文本。
答案 1 :(得分:5)
我尝试使用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')
答案 2 :(得分:1)
$ host.UI.RawUI.WindowTitle =“新标题”
正如乔治已经说过的,任何人/任何人都可以将其设置回来(例如自定义提示功能)。
答案 3 :(得分:0)
如果您想使用带有自定义标题的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)
请注意为标题转义字符串的严重字符,它们至关重要!