将CMD标题更改回原来的标准(批处理)

时间:2017-03-03 23:42:18

标签: windows batch-file cmd

我正在尝试让我的批处理脚本更改命令提示符的标题,以更改回脚本开始之前的状态。

以下是一个例子:

@echo off
title My Script
REM rest of script here
:end
title %origcmdtitle%

所以在它运行之前,它会有它的默认标题;类似Command PromptC:\Windows\system32\cmd.exe

的内容

然后,当我的脚本运行时,标题将更改为My Script

最后,当脚本结束时,我希望它更改回CMD的原始标题(它只保留为My Script

谢谢!

5 个答案:

答案 0 :(得分:3)

这一直是编写批处理代码的许多棘手问题之一。

我已经看到了一些相当复杂的代码,试图辨别当前标题并将值保存在变量中,以便在批处理脚本结束之前恢复标题。但我对这些结果从未完全满意。

我认为最强大和最直接的方法是在新的cmd.exe会话中启动脚本,然后您可以在其中设置标题而不受惩罚。脚本结束后,子进程将结束,原始cmd.exe进程将恢复控制并恢复原始标题。

如果您使用“唯一”额外参数来表示已发生重新启动,则可以在新的cmd.exe会话中重新启动脚本。然后,您可以使用SHIFT恢复原始参数。

这是一个简单的例子:

@echo off
if "%~1" equ ":SET-TITLE" goto %1
cmd /c "%~f0" :SET-TITLE %*
exit /b

:SET-TITLE
shift /1
title myTitle
echo %%1=%1  %%2=%2
pause
exit /b

这种方法存在一些潜在的问题。

  • 多次解析任何命令行参数,如果存在转义的毒性字符,则可能会出现问题。逃跑必须加倍。

  • 脚本终止后,脚本无法进行环境变量更改,除非您将变量写入文件,然后在返回父会话后重新加载文件中的值。

答案 1 :(得分:2)

以下是使用确定当前命令窗口的PID的方法的一些示例代码; (几年前由DosTips dbenham开发)

@Echo Off
Set "_PI="
Call :getPID _PI
If Not Defined _PI GoTo :EOF
Set "_WT="
For /F "Tokens=1* Delims=:" %%A In ('TaskList /FI "PID EQ %_PI%" /V /FO LIST'
) Do Set "_WT=%%B"
If Not Defined _WT GoTo :EOF
Set "_WT=%_WT:~1%"
Echo( CURRENT TITLE IS: %_WT%
Timeout 5 /NOBREAK>Nul
Title NEW TITLE
Echo( A NEW TITLE HAS BEEN GIVEN
Timeout 5 /NOBREAK>Nul
Title %_WT%
Echo( THE ORIGINAL TITLE HAS BEEN RESTORED
Timeout 5 /NOBREAK>Nul
GoTo :EOF

:getPID  [RtnVar]
::
:: Store the Process ID (PID) of the currently running script in environment variable
:: RtnVar. If called without any argument, then simply write the PID to stdout.
::
setlocal disableDelayedExpansion
:getLock
set "lock=%temp%\%~nx0.%time::=.%.lock"
set "uid=%lock:\=:b%"
set "uid=%uid:,=:c%"
set "uid=%uid:'=:q%"
set "uid=%uid:_=:u%"
setlocal enableDelayedExpansion
set "uid=!uid:%%=:p!"
endlocal & set "uid=%uid%"
2>nul ( 9>"%lock%" (
  for /f "skip=1" %%A in (
    'wmic process where "name='cmd.exe' and CommandLine like '%%<%uid%>%%'" get ParentProcessID'
  ) do for %%B in (%%A) do set "PID=%%B"
  (call )
))||goto :getLock
del "%lock%" 2>nul
endlocal & if "%~1" equ "" (echo(%PID%) else set "%~1=%PID%"
exit /b

答案 2 :(得分:0)

我通过使用PowerShell将原始标题存储在文件中,然后将标题读回到变量中解决了这个问题。

这里是一个例子:

powershell -noprofile -command "[system.console]::title">%TEMP%\~wndtitle.tmp
for /F "tokens=1 delims=-" %%i in (%TEMP%\~wndtitle.tmp) do set title_org=%%i
title This is a test!
pause
title %title_org%
pause

答案 3 :(得分:0)

可以简单地恢复默认标题: title %ComSpec%

答案 4 :(得分:-2)

我不是批处理专家,但您可以尝试将变量设置为CD,如下所示:

{{1}}