【问题标题】:Windows batch cmd file "title" command not workingWindows 批处理 cmd 文件“标题”命令不起作用
【发布时间】:2021-05-21 15:50:12
【问题描述】:

我想更改从批处理文件运行的 cmd 窗口标题栏的标题,但显然标题命令不适用于批处理 (.cmd) 文件。

当我用谷歌搜索并阅读 stackoverflow 时,我发现有三个可能的命令可以解决这个问题,但到目前为止它们都没有对我有用:

start "<title>" # => this starts a new shell window, not a solution
system "title \"Window title\""; # => "system" not found 
title cmdtitle # => this works on a manually opened cmd window (win-R -> cmd) but does not work on batch files

那么,这有什么问题呢?

(编辑)

如下图,“title[title]”由于某种原因不起作用……

【问题讨论】:

  • 打开command prompt,运行help,查看Windows commands的输出列表,并附上简要说明。使用/? 作为参数运行命令START(或任何其他命令)以获取命令的帮助输出。试试start /?。您需要的是命令TITLE。可以在运行title /? 时阅读此命令的简短帮助。批处理文件中的title %~n0 将控制台窗口的标题更改为批处理文件的名称。
  • 好吧,仅使用title %~n0 并不安全。批处理文件可能会对某人进行恶意操作,重命名批处理文件并添加一个与符号,如Development &amp; Test!.cmd。为了以安全的方式使用批处理文件名作为窗口标题,而不在窗口标题中显示的%~n0 周围使用",必须使用以下行:1.setlocal EnableExtensions DisableDelayedExpansion,2.set "BatchName=%~n0",3。 setlocal EnableDelayedExpansion, 4. 标题!BatchName!, 5. endlocal 和再次endlocal
  • 嗨,谢谢@Mofi。我尝试了文字“title %~n0”,但不幸的是它也没有用。我知道为什么真的......我附上了截图,请看一下。
  • 好吧,你运行 Linux shell 解释器bash 来执行-c 之后指定的命令行来执行figlet 并传递frpc_wake.cmd。为什么批处理文件frpc_wake.cmd 不能直接运行? figlet 到底是什么?为什么在 Windows 上使用 Linux shell 解释器bashbash 无法解释 Windows 批处理文件,figlet 很可能会启动 C:\Windows\System32\cmd.exe 来处理批处理文件。因此,窗口标题通过命令 TITLE 更改为 frpc_wake,但接下来很快被用于处理 croncli.cmdcmd.exe 的开始全名替换。
  • 为什么批处理文件croncli.cmd 没有使用命令CALLfrpc_wake.cmd 中调用?请参阅我在How to call a batch file that is one level up from the current directory? 上的回答,无论您想做什么,您肯定使用了太多的脚本解释器。控制台窗口标题一旦由命令 TITLE 设置就不再固定。它也可以被其他程序更改,并且由于一系列脚本解释器一个接一个地启动而发生在这里。

标签: windows batch-file cmd


【解决方案1】:

所以,感谢@Mofi,我知道出了什么问题,这里是解决我尝试过的问题的变通方法。

-- 原因:

此问题的原因是批处理文件中的“someprogram.cmd --option 不管”行。在另一个 cmd 程序文件中,应该有一些“标题”行覆盖了之前定义的标题行。

-- 解决办法

虽然我不熟悉 cmd 脚本并对这个标题行为感到沮丧(标题很容易被覆盖,而且显然它是一种习惯编码 - 就像这种情况下 nodejs - ),但实际上没有办法但需要采取对此问题进行了一些额外的努力,这是解决方法

  1. 手动修改子cmd程序文件(本例为node.js生成文件)

在这种情况下,里面的node.js cmd程序是这样的,这个特定的行定义了“标题”并导致覆盖它所以修改该行。

(默认)

endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%"  "%dp0%\node_modules\node-cron-cli\croncli" %*

(例如)

endLocal & goto #_undefined_# 2>NUL || title croncli.cmd & "%_prog%"  "%dp0%\node_modules\node-cron-cli\croncli" %*
  1. 覆盖最后一个子程序中的标题

从任何时候标题都是最后定义的前提来看,最有效的方法应该是在最后一个程序,即主node.js程序(在这种情况下)上定义“标题”。

这将从 node.js 定义 Windows cmd 标题。这还没有经过我自己的测试,但应该可以工作。

if (process.platform == 'win32') {
  process.title = title;
} else {
  process.stdout.write('\x1b]2;' + title + '\x1b\x5c');
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2011-06-07
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多