古い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
プロセスのメインウィンドウのテキストを変更するときに小さな癖があります。プロセスを開始した直後にテキストを変更しようとすると、考えられる多くの理由の1つ(たとえば、表示されるコントロールへのハンドル)が原因で失敗する可能性があります。関数呼び出しの時点ではテキストは存在しません)。したがって、解決策は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="新しいタイトル"
ジョージがすでに言ったように、何でも/誰でもそれを元に戻すことができます(たとえばカスタムプロンプト関数のように)。