How can I get the value of the current window's
title, set like this:
TITLE Here Are The New Contents
Super User is a question and answer site for computer enthusiasts and power users. It only takes a minute to sign up.Sign up to join this community
In cmd.exe (usual command line prompt):
Set window's title:
title "Your New Title"
Get window's title: I didn't found anything useful to do such thing, However if you have some knowledge with C# or Visual Basic, you can develop a little program that will look in opened windows to find your command line and return the title for you. (using the PID of parent process (your cmd.exe))
In Powershell: (things are easy here)
Set window's title:
[system.console]::title = "Your New Title"
Get window's title:
$myTitleVar = [system.console]::title
or you can output it directly:
Calling PowerShell from your batch file via its CLI,
powershell.exe, is easiest:
:: Outputs the window title. powershell -noprofile -c [Console]::Title | findstr .
[Console]::Title returns the current console window's title using the
System.Console .NET class; PowerShell provides access to all .NET types.
findstr . command is a dummy command, which is necessary to prevent the output from containing a
- <command-line> suffix, owing to the fact that
cmd.exe appends such a suffix to the window title while a command line is executing (
<command-line> here represents the specific command line invoked).
Appending a suffix does not happen if a pipeline (
|) is used, so the addition of
| findstr . exe - which simply passes (non-empty) output through - is enough to prevent a suffix from showing in the result.
Complete example that shows how to capture the title in a variable:
@echo off & setlocal :: Assign a custom title. title This ^& That :: Retrieve the current title and store it var. %thisTitle% for /f "delims=" %%t in ( 'powershell -noprofile -c [Console]::Title ^| findstr .' ) do set thisTitle=%%t echo This window's title: "%thisTitle%"
The above yields:
This window's title: "This & That"
More cumbersome alternative via
The ingredients for this solution are in AtomicFireball's answer and a comment on it, but how to put them all together may not be obvious. The code below does that.
As you can see, the solution is much more complex compared to the PowerShell solution; note that using
powershell.exe with the
-Command) parameter is not subject to the infamous PowerShell execution policy, so there should be no concern about using PowerShell for this task.
Complete example (same output as above):
:: Assign a custom title. title This ^& That :: Find the PID (process ID) of this cmd.exe session. :: Note: A *temporary file* is required to capture the command output, :: for later parsing. A `for /f` command cannot be used DIRECTLY :: because it would execute the command in a *child* cmd.exe process, :: which would report the wrong PID. :: Get a path for a temporary file. set TEMPFILE=~getpid_%DATE%%TIME%.txt set TEMPFILE=%TEMPFILE:/=% set TEMPFILE=%TEMPFILE::=% set TEMPFILE=%TEMP%\%TEMPFILE: =% WMIC process get Name,ParentProcessId | findstr "^WMIC\.exe" > "%TEMPFILE%" for /f "tokens=2" %%i in (%TEMPFILE%) do set PID=%%i del "%TEMPFILE%" :: Now use the PID to look up process details, which includes the window title. for /f "tokens=1,* delims=:" %%i in ( 'tasklist /fi "PID eq %PID%" /fo list /v ^| findstr "^Window Title:' ) do set thisTitle=%%j :: Trim the leading space: for /f "tokens=*" %%i in ("%thisTitle%") do set thisTitle=%%i echo This window's title: "%thisTitle%"
Or for short as a batch function:
rem # Assign a custom title. title This ^& That rem # Retrieve the current title. CALL :getWindowTitle windowTitle ECHO windowTitle="%windowTitle%". GOTO :EOF :getWindowTitle titlevar SETLOCAL FOR /f "usebackq delims=" %%t IN (`powershell -noprofile -c "[system.console]::title"`) DO SET "thisTitle=%%t" ENDLOCAL&CALL SET "%~1=%thisTitle%" GOTO :EOF