【问题标题】:Run alias command from command prompt in new command prompt在新命令提示符下从命令提示符运行别名命令
【发布时间】:2015-05-05 13:39:53
【问题描述】:

所以我为我常用的命令设置了一个带有一些别名的文件。我像this answer一样将它添加到注册表中。

我想像这样使用这个别名:

>cmd /k newalias 
'newalias' is not recognized as an internal or external command,
 operable program or batch file.

所以不能使用这个别名。 如果我再次输入>cmd /k newalias,现在它可以工作了,所以问题似乎是在执行别名文件中的doskey命令之前正在运行该命令。

有没有什么办法可以等到创建了这些别名之后再运行命令?

【问题讨论】:

  • 您不能像您尝试的那样使用别名作为实际命令。 doskey.exe 为控制台 API AddConsoleAlias 提供命令行界面。别名在控制台 (conhost.exe) 中实现。当别名在输入行的开头匹配时,它们会转换输入缓冲区。当前的别名集取决于前台进程名称。它与 cmd.exe 无关,除非您为“cmd.exe”定义了别名并且 cmd 是控制台中的当前前台进程。
  • 此外,使用/macrofile option 一次性加载所有别名会更简单、更高效。

标签: windows alias command-prompt doskey


【解决方案1】:

奇怪的行为,但是如果您在导入正在工作的宏后使用 doskey:

cmd /K "doskey /macrofile=c:\temp\macros.txt  & doskey /macros >null & newalias"

编辑上面的命令不起作用,newalias 必须在控制台中手动写入。

【讨论】:

  • 我在 macros.txt 中定义了newalias,但是这个命令只会导致错误消息'newalias' is not recognized ...。它不是可以通过CreateProcessShellExecuteEx 找到并执行的文件,也不是像bash 别名那样由shell 实现的。
  • 别名会在 conhost.exe 中的输入被客户端进程通过ReadFileReadConsoleReadConsoleInput 读取之前对其进行转换。这种基于控制台的别名系统在某些方面是相当有限的——例如它不能被一般地视为命令,并且必须为每个控制台窗口加载。但它在某些方面也更强大——例如。可以专门为任何可执行文件定义别名,例如 cmd.exe、powershell.exe、cdb.exe、python.exe 等(在宏文件中使用 [cmd.exe] 等部分)。
  • 我也在使用 Windows 7 x64 工作站。 newalias 的定义是什么?我只是 newalias=dir 进行测试。也许您有一个名为“newalias”的实际批处理文件或可执行文件。检查where newalias
  • 我刚试过 np=notepad++.exe。尝试删除 >null 以查看是否有帮助
  • 我无法理解它是如何为你工作的(我现在还不排除它,但它让我感到困惑)。对我来说,所有“工作”是通过CreateProcess 执行cmd.exe,然后调用WriteConsoleInput"newalias\r\n" 作为INPUT_RECORD 记录的序列写入控制台。所以这就像我在提示符下手动输入newalias一样。使用管道也不起作用,因为它不通过 conhost.exe;我知道不会,但我还是通过echo newalias | cmd 尝试了。