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

时间:2010-07-01 04:31:41

标签: powershell start-process

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

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

这可以按预期使用My Title作为窗口标题启动ConsoleApp。这已经被正常工作的Start-Process取代,但没有提供更改标题的机制。

还有另一种方法可以在没有使用cmd命令的情况下执行吗?

4 个答案:

答案 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)

请注意为标题转义字符串的严重字符,它们至关重要!