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

ovfsdjhp  于 2023-01-02  发布在  Windows
关注(0)|答案(7)|浏览(278)

我正在尝试让我的批处理脚本更改命令提示符的标题,以更改回脚本启动之前的标题。
下面是一个例子:

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

所以在它运行之前,它会有一个默认的标题;比如Command PromptC:\Windows\system32\cmd.exe
然后,当脚本运行时,标题更改为My Script
最后,当脚本结束时,我希望它改回原来的标题CMD(它只是保持为My Script
谢谢!

wn9m85ua

wn9m85ua1#

这一直是编写批处理代码的许多棘手问题之一。
我看到过一些相当复杂的代码试图识别当前的标题并将值保存在变量中,以便在批处理脚本结束之前恢复标题,但我从未对这些结果完全满意。
我认为最可靠和直接的方法是在新的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

这种方法有几个潜在的问题。

  • 任何命令行参数都要被解析多次,如果有转义的有害字符,这可能会有问题。转义字符必须加倍。
  • 脚本终止后,脚本所做的环境变量更改不可能继续存在,除非将变量写入文件,然后在返回父会话后从文件重新加载值。
r1zk6ea1

r1zk6ea12#

这里是使用确定当前命令窗口的PID的方法的一些示例代码;* (几年前由dbenham在DosTips上开发)*。

@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
kyvafyod

kyvafyod3#

可以简单地恢复默认标题:第一个月

qoefvg9y

qoefvg9y4#

Andreas给出的答案应该是赞成的,因为它非常擅长实际获取当前的cmd窗口标题。
答案可以进一步细化,以避免需要临时文件:

@REM Store current title in variable title_org
for /F "tokens=1 delims=- USEBACKQ" %%i in (`powershell -noprofile -command "[system.console]::title"`) do set title_org=%%i

title My title
echo do some work

@REM Restore title
title %title_org%

请注意,以上命令必须在批处理文件中使用。如果在交互式命令窗口中测试命令,则必须将%%i减少为仅%i:

for /F "tokens=1 delims=- USEBACKQ" %i in (`powershell -noprofile -command "[system.console]::title"`) do set title_org=%i
ltskdhd1

ltskdhd15#

我通过使用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
oxosxuxt

oxosxuxt6#

答案是:

@echo off
rem set your title
title My Sublime Title
pause
rem reset title to the default value
title %comspec%
b4qexyjb

b4qexyjb7#

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

@echo off
set Original=%CD%
pause >nul
title Hi
pause >nul
title %Original%

相关问题