我正在尝试让我的批处理脚本更改命令提示符的标题,以更改回脚本开始之前的状态。
以下是一个例子:
@echo off
title My Script
REM rest of script here
:end
title %origcmdtitle%
所以在它运行之前,它会有它的默认标题;类似Command Prompt
或C:\Windows\system32\cmd.exe
然后,当我的脚本运行时,标题将更改为My Script
最后,当脚本结束时,我希望它更改回CMD的原始标题(它只保留为My Script
)
谢谢!
答案 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}}