我正在将旧cmd
命令转换为 Powershell,目前使用:
START "My Title" Path/To/ConsoleApp.exe
这可以按预期工作以启动 ConsoleApp,并将我的标题作为它的窗口标题。这已被替换为正常工作的 Start-Process,但不提供更改标题的机制。
有没有其他方法可以在不使用命令的情况下做到这一点cmd
?
我正在将旧cmd
命令转换为 Powershell,目前使用:
START "My Title" Path/To/ConsoleApp.exe
这可以按预期工作以启动 ConsoleApp,并将我的标题作为它的窗口标题。这已被替换为正常工作的 Start-Process,但不提供更改标题的机制。
有没有其他方法可以在不使用命令的情况下做到这一点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')
如果您想使用带有自定义标题的 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)
请注意转义标题字符串的反引号字符,它们至关重要!
$host.UI.RawUI.WindowTitle = "新标题"
正如乔治已经说过的那样,任何/任何人都可以将其设置回来(例如自定义提示功能)。