如何启动基于控制台的进程并使用Powershell应用自定义标题

如何启动基于控制台的进程并使用Powershell应用自定义标题,powershell,start-process,Powershell,Start Process,我正在将旧的cmd命令转换为Powershell,目前正在使用: START "My Title" Path/To/ConsoleApp.exe 这与预期的一样,可以启动ConsoleApp,将我的标题作为窗口标题。这已被正常工作的启动过程所取代,但不提供更改标题的机制 有没有其他方法不用使用cmd命令就可以做到这一点呢?我用cmd.exe尝试过,效果很好 Add-Type -Type @" using System; using System.Runtime.InteropServices;

我正在将旧的
cmd
命令转换为Powershell,目前正在使用:

START "My Title" Path/To/ConsoleApp.exe
这与预期的一样,可以启动ConsoleApp,将我的标题作为窗口标题。这已被正常工作的启动过程所取代,但不提供更改标题的机制


有没有其他方法不用使用
cmd
命令就可以做到这一点呢?

我用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')

更改进程主窗口的文本时有一个小怪癖:如果在启动进程后直接尝试更改文本,可能会由于多种原因之一而失败(例如,函数调用时显示文本的控件句柄不存在)。因此,解决方案是在尝试更改文本之前使用
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")

请注意,在您自己进行更改后,应用程序本身仍然可以更改窗口文本。

$host.UI.RawUI.WindowTitle=“新建标题”


正如George已经说过的,任何人/任何人都可以将其设置回原位(例如自定义提示功能)。

如果您想使用带有自定义标题的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)

请注意,从标题字符串中转义的反勾字符,它们是至关重要的

这对我来说不起作用,至少对于
CMD.EXE
作为所讨论的进程(如OP所指定的)来说不起作用
WaitForInputIdle()
为非GUI应用程序引发了一个
InvalidOperationException
,为非GUI应用程序的
MainWindowHandle
0
。不幸的是,这对我不起作用。我需要运行一个非gui应用程序,但出现以下错误:使用“0”参数调用“WaitForInputIdle”时出现异常:“WaitForInputIdle失败。这可能是因为进程没有图形界面。”在我的脚本中,行“[wt.temp]::SetWindowText($cmd.MainWindowHandle,'some text')”有时返回True,有时返回False,但它从未设置我的非GUI应用程序的标题。它现在正在工作!我真的不知道是什么改变了。也许我只是需要重新启动我的powershell。感谢您提供此代码。此解决方案并不总是适用于我。在尝试设置窗口标题之前,我添加了一个延迟(启动睡眠-S5),现在似乎工作得更可靠了。有任何解决方案适合您吗?对于我的非gui应用程序,它不工作,因为WaitForInputdle无法工作(请参阅下面回答评论中的错误)。完美!比其他解决方案简单得多。我不知道为什么它没有投票权。。。