Windows 命令提示符中的别名

526

我已经将notepad++.exe添加到环境变量的路径中。

现在在命令提示符中,notepad++.exe filename.txt会打开filename.txt。但我想只用np filename.txt来打开文件。

我尝试使用DOSKEY np=notepad++。但它只是将已经打开的Notepad++带到前台而不打开文件。如何让它打开文件?


6
将可执行文件名更改为任何您想要的名称。 您可以从文件资源管理器中完成此操作! - IgorGanapolsky
23个回答

614
为了补充Josh的答案,您可以通过以下步骤使别名(们)持久存在:
  1. 创建一个批处理文件以及您的 DOSKEY 命令。

  2. 运行注册表编辑器并转到 HKEY_CURRENT_USER\Software\Microsoft\Command Processor

  3. 添加字符串值条目,名称为 AutoRun,路径为您的 .bat/.cmd 文件的完整路径。

    例如,%USERPROFILE%\alias.cmd,将路径的初始部分替换为%USERPROFILE% 对于在多台机器之间同步非常有用。

这样,每次运行 cmd 时,都会加载别名。
对于Windows 10或Windows 11 ,请将条目添加到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
(对于 Windows 11,请注意,默认情况下“终端应用程序”指向 PowerShell。搜索“cmd”以打开命令提示符)
为了完整起见,这里是一个模板,说明一些可能有用的别名。
@echo off

:: Temporary system path at cmd startup

set PATH=%PATH%;"C:\Program Files\Sublime Text 2\"

:: Add to path by command

DOSKEY add_python26=set PATH=%PATH%;"C:\Python26\"
DOSKEY add_python33=set PATH=%PATH%;"C:\Python33\"

:: Commands

DOSKEY ls=dir /B $*
DOSKEY sublime=sublime_text $*  
    ::sublime_text.exe is name of the executable. By adding a temporary entry to system path, we don't have to write the whole directory anymore.
DOSKEY gsp="C:\Program Files (x86)\Sketchpad5\GSP505en.exe"
DOSKEY alias=notepad %USERPROFILE%\Dropbox\alias.cmd

:: Common directories

DOSKEY dropbox=cd "%USERPROFILE%\Dropbox\$*"
DOSKEY research=cd %USERPROFILE%\Dropbox\Research\

请注意,$*语法可用于目录字符串以及接受参数的可执行文件。因此,在上面的示例中,用户定义的命令dropbox research指向与research相同的目录。
正如Rivenfall所指出的那样,包括一个允许方便编辑alias.cmd文件的命令是个不错的主意。请参见上面的alias。如果在cmd会话中,请输入cmd以重新启动cmd并重新加载alias.cmd文件。
当我在互联网上搜索答案时,似乎讨论要么只集中在持久性上,要么只关注DOSKEY的某些用法。希望这里将这两个方面结合在一起对某些人有所帮助!
这里有一个.reg文件,可以帮助您安装alias.cmd。现在它被设置为如上建议的一个dropbox文件夹示例。
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"AutoRun"="%USERPROFILE%\\alias.cmd"

对于单用户应用程序,上述内容就足够了。然而,在某些情况下需要首先检查注册表键中是否存在alias.cmd。请参见以下示例。

在一个 C:\Users\Public\init.cmd 文件中,可能托管跨用户配置:

@ECHO OFF
REM Add other configurations as needed
IF EXIST "%USERPROFILE%\alias.cmd" ( CALL "%USERPROFILE%\alias.cmd" )

应相应地更新注册表键以匹配 C:\Users\Public\init.cmd,或者使用 .reg 文件:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"AutoRun"="C:\\Users\\Public\\init.cmd"

4
正是我所需要的;运作完美;我建议添加一个 doskey 来实际编辑 env.cmd 文件。 - Rivenfall
12
这是天真且低效的。自动运行的批处理文件将在每个cmd.exe实例中运行,包括“system”函数。如果已定义某个变量(例如“AUTORUN”),它需要退出。否则,在一个过程中设置环境(set AUTORUN=1)并使用宏文件选项设置doskey,而不是运行doskey.exe来定义每个别名。 - Eryk Sun
4
@eryksun能否提供一个不那么幼稚的示例或链接?我知道如何在定义了autorun的情况下退出,但是对于如何在没有运行CMD的情况下首先设置或取消它感到困惑。 - matt wilkie
8
现在有哪个路径可以替代 HKEY_CURRENT_USER\Software\Microsoft\Command Processor?我在注册表编辑器中似乎找不到这个路径了。 - Jan
5
我喜欢这个。还有一个类似的选择,可以在autorun中加入:doskey /macrofile="%USERPROFILE%\alias"。接下来,在'alias'文件中放置别名,不包括'doskey'部分。这是管理员可以使用的解决方案,以将autorun定义限制为用户可以自行创建的别名。从而防止用户自动运行其他内容。 - user1708042
显示剩余21条评论

286

你需要传递参数,请尝试以下方式:

doskey np=notepad++.exe $*

编辑(回应Romonov的评论)问:「有没有办法让命令提示符记住这个命令,这样我就不必每次打开新的命令提示符时都要运行它?」

doskey是一个文本命令,由命令处理器(例如cmd.exe)解释执行,它无法知道如何修改其他进程中的状态(尤其是那些尚未启动的进程)。

使用doskey来设置初始命令 shell 环境的人通常使用 /K 选项(通常通过快捷方式)运行一个批处理文件,该文件完成所有常见设置(如设置窗口标题、颜色等)。

cmd.exe /K env.cmd

env.cmd:

title "Foo Bar"
doskey np=notepad++.exe $*
...

9
这适用于我运行此命令的命令提示符,但如果我关闭窗口并打开一个新的命令提示符,则它不会记住np命令。有没有办法让命令提示符记住,这样我就不必每次打开一个新的命令提示符时都要运行这个命令了? - Romonov
6
不更改路径,相同的行为:doskey npp="C:\Program Files (x86)\Notepad++\notepad++.exe" $* - Matt Bierner
6
doskey.exe与cmd.exe没有任何关系。它为控制台窗口中的当前或指定可执行文件设置别名,该窗口由conhost.exe实例托管。在客户端应用程序(例如cmd.exe或powershell.exe)读取该行之前,控制台别名将在输入行开头匹配并替换。它们不能通用作为命令使用,例如不能在批处理文件或管道中使用。 - Eryk Sun
嗨,我已经使用这个与cmder一起打开了phpstorm...它打开了phpstorm,但它一直打开我上次打开的项目而不是我当前所在的项目目录...我该如何让它打开我当前所在的任何目录? - CodeConnoisseur
@PA-GW:您在 doskey 命令中是否使用了“phpstorm $ *”?您尝试过 phpstorm .(请注意,点表示“当前目录”的快捷方式)吗? - user unknown
这种方法在Windows终端中非常有效,因为您可以在“命令行”属性中输入“/K env.cmd”。 - Warpstar22

221

如果你只需要一些简单的命令,可以按照以下步骤操作:

  1. 创建一个名为C:\Aliases的文件夹
  2. C:\Aliases添加到你的路径中(因此其中的任何文件都将在每次查找时被找到)
  3. 为想要的每个别名在C:\Aliases中创建一个.bat文件

可能有些繁琐,但与@Argyll的(否则非常好的)答案不同,这解决了每次加载的问题。

例如,我有一个名为dig2.bat的文件,其中包含以下内容:

@echo off
echo.
dig +noall +answer %1

您的np文件只需要包含以下内容:

@echo off
echo.
notepad++.exe %1

只需将C:\Aliases文件夹添加到您的PATH环境变量中。如果您已经打开了CMD或PowerShell,则需要重新启动。

顺便说一下,我在C:\ Aliases目录中有大约20个别名(单独的.bat文件),我只是根据需要创建新的别名。也许不是最整洁的,但它工作得很好。

更新:根据用户@Mav的绝妙建议,最好使用%*而不是%1,这样您就可以将多个文件传递给命令,例如:

@echo off
echo.
notepad++.exe %*

这样,你就可以这样做:

np c:\temp\abc.txt c:\temp\def.txt c:\temp\ghi.txt

它将会打开这3个文件。


9
我个人长期使用这种方法。如果有人不想走“doskey”的路线,这是一种非常容易实现的方法之一。 - bantya
7
使用cmd文件作为别名的一个优点是,如果你使用WSL(Windows的Linux子系统),这些命令也可以在bash中使用。尽管通常情况下(取决于你正在别名化的内容),在调用cmd文件之前需要使用wslpath.sh或类似工具进行一些路径操作。 - Alex Perry
1
@Qwerty,在上面的另一个答案的评论中,我指出我从来不使用与基础命令相同名称的别名,所以我猜这从未发生过!实际上,你不能在你的.bat文件中充分限定“ls”命令吗? - roryhewitt
1
@roryhewitt 哦,是的,指定到 ls.exe 的完整路径肯定可以工作。好主意。不过我已经使用了 doskey 替代方案。 - Qwerty
11
建议使用 %* 而不是 %1,以传递所有参数而不仅仅是第一个。 - Mav
显示剩余10条评论

45

或者你可以使用 cmder,这个工具可以像Linux一样添加别名:

alias subl="C:\Program Files\Sublime Text 3\subl.exe" $*

17
尽管这并没有回答问题,但对于有Linux背景的人来说很重要的一点是要明白,存在一种可以满足他们即时需求的替代Windows命令提示符的选择。 - Joseph Casey
2
有相当多的选择。Windows版Git附带了一个名为“git-bash”的工具。 - cowlinator
要在Cmder中添加别名,请参见此处的示例(https://dev59.com/7Ggu5IYBdhLWcg3wzKAc#54478765)。 - jdhao
嗨,我已经使用这个工具与cmder一起打开phpstorm了...它成功打开了phpstorm但却一直打开我上次打开的项目,而不是我当前所在的项目目录...我该如何让它打开我正在使用的目录? - CodeConnoisseur
@PA-GW 你可能想要在phpstorm中添加.作为参数,以告诉它打开当前目录。请参阅Jetbrains的此帮助条目获取更多信息,以及此处获取phpstorm的其他命令行选项。 - geisterfurz007
同意,尽管这并没有回答问题,但对于许多将搜索此问题的人来说,它更好地满足了需求。 - jabberwocky

36

假设你将notepad++.exe添加到了你的PATH环境变量中,那么这就非常简单了。 在你的System32文件夹中创建一个名为np.bat的文件,并将以下代码复制进去:

@echo off
call notepad++.exe %*

%*将您给np命令的所有参数传递给notepad++.exe命令。

编辑: 您需要管理员权限才能将文件保存到System32文件夹中,这对我来说有点棘手。我只是在其他地方创建了文件,然后手动将其移动到System32中。


我已经有一些小的.bat实用程序文件夹,所以我更喜欢这个而不是去修改注册表或者一个.cmd文件。 - Rich
1
我刚试了一下,它的效果并不完全相同于直接调用Notepad++。如果你在打开的文件名中使用通配符,并直接调用NPP,它是可以工作的,例如你可以这样做:"notepad++.exe somefiles",匹配的文件将会被打开。当我尝试使用你建议的批处理文件时,即"npp somefiles",它确实打开了一个NPP实例,但没有打开我传递的文件。有什么想法吗? - SSilk
像魔法一样运作良好,对于我的情况,我想运行多个具有不同别名的PHP版本,如php7、phpx等,这个方法适用于我。 - Abdulbasit

19

此外,您可以在路径中创建一个别名.cmd文件(例如C:\ Windows),其中包含以下命令:

@echo %2 %3 %4 %5 %6 > %windir%\%1.cmd

完成这个步骤后,你可以像这样做:

alias nameOfYourAlias commands to run 

之后,您可以在命令行中输入

nameOfYourAlias 

这将会执行

commands to run 

但是对我来说最好的方法就是添加程序的路径。

setx PATH "%PATH%;%ProgramFiles%\Sublime Text 3" /M 

现在我将 Sublime 当作

subl index.html

1
不要使用 setx 命令来设置 PATH 环境变量,否则可能会永久截断你的路径。 - Amit Naidu

14

Windows 10中的控制台别名

要定义控制台别名,请使用Doskey.exe创建宏,或使用AddConsoleAlias函数。

doskey

doskey test=cd \a_very_long_path\test

为了也传递参数,请在结尾加上$*doskey short=longname $*

AddConsoleAlias

AddConsoleAlias( TEXT("test"), 
                 TEXT("cd \\<a_very_long_path>\\test"), 
                 TEXT("cmd.exe"));

这里有更多信息:控制台别名Doskey参数


顺便说一句,我在下面提供了一个新的、更好的答案,可以让你为每个命令注册别名。https://dev59.com/-2Ij5IYBdhLWcg3wMiYu#59978163 - Qwerty

12

自然而然,我会不停地努力寻找 最方便的解决方案。结合广阔互联网上的许多答案和主题,以下是您可以拥有的方案。

  • 每次实例化cmd时自动加载
  • 不需要关键字DOSKEY用于别名
    例如:ls=ls --color=auto $*

请注意,这主要是基于Argyll的回答和评论,一定要阅读它以了解概念。

cmd greetings & aliases

如何使其工作?

  1. 使用别名创建一个mac宏文件
    您甚至可以使用bat/cmd文件来运行其他东西(类似于Linux中的.bashrc
  2. 在注册表中注册它以在每个实例的cmd上运行
      或仅通过快捷方式运行它(如果您想)

示例步骤:

%userprofile%/cmd/aliases.mac

;==============================================================================
;= This file is registered via registry to auto load with each instance of cmd.
;================================ general info ================================
;= https://dev59.com/-2Ij5IYBdhLWcg3wMiYu#59978163  -  how to set it up?
;= https://gist.github.com/postcog/5c8c13f7f66330b493b8  -  example doskey macrofile
;========================= loading with cmd shortcut ==========================
;= create a shortcut with the following target :
;= %comspec% /k "(doskey /macrofile=%userprofile%\cmd\aliases.mac)"

alias=echo Opening aliases in Sublime... && subl %USERPROFILE%\cmd\aliases.mac
ga=grep --color "$1" %USERPROFILE%\cmd\aliases.mac

hosts=runas /noprofile /savecred /user:QWERTY-XPS9370\administrator "subl C:\Windows\System32\drivers\etc\hosts" > NUL

p=@echo "~~ powercfg -devicequery wake_armed ~~" && powercfg -devicequery wake_armed && @echo "~~ powercfg -requests ~~ " && powercfg -requests && @echo "~~ powercfg -waketimers ~~"p && powercfg -waketimers

ls=ls --color=auto $*
ll=ls -l --color=auto $*
la=ls -la --color=auto $*
grep=grep --color $*

~=cd %USERPROFILE%
cdr=cd C:\repos
cde=cd C:\repos\esquire
cdd=cd C:\repos\dixons
cds=cd C:\repos\stekkie
cdu=cd C:\repos\uplus
cduo=cd C:\repos\uplus\oxbridge-fe
cdus=cd C:\repos\uplus\stratus

npx=npx --no-install $*
npxi=npx $*
npr=npm run $*

now=vercel $*


;=only in bash
;=alias whereget='_whereget() { A=$1; B=$2; shift 2; eval \"$(where $B | head -$A | tail -1)\" $@; }; _whereget'

history=doskey /history
h=IF ".$*." == ".." (echo "usage: h [ SAVE | TAIL [-|+<n>] | OPEN ]" && echo. && doskey/history) ELSE (IF /I "$1" == "OPEN" (%USERPROFILE%\cmd\history.log) ELSE (IF /I "$1" == "SAVE" (echo **** %date% %time% **** >> %USERPROFILE%\cmd\history.log & doskey/history >> %USERPROFILE%\cmd\history.log & ECHO Command history saved) ELSE (IF /I "$1" == "TAIL" (tail $2 %USERPROFILE%\cmd\history.log) ELSE (doskey/history))))

;=exit=echo **** %date% %time% **** >> %USERPROFILE%\cmd\history.log & doskey/history >> %USERPROFILE%\cmd\history.log & ECHO Command history saved, exiting & timeout 1 & exit $*
exit=echo **** %date% %time% **** >> %USERPROFILE%\cmd\history.log & doskey/history >> %USERPROFILE%\cmd\history.log & exit $*

;============================= :end ============================
;= rem ******************************************************************
;= rem * EOF - Don't remove the following line.  It clears out the ';'
;= rem * macro. We're using it because there is no support for comments
;= rem * in a DOSKEY macro file.
;= rem ******************************************************************
;=

现在您有三个选项:
  • a) 手动加载快捷方式

    创建一个指向 cmd.exe 的快捷方式,目标如下:
    %comspec% /k "(doskey /macrofile=%userprofile%\cmd\aliases.mac)"

  • b) 仅注册 aliases.mac 宏文件

  • c) 注册一个常规的 cmd/bat 文件以运行任意命令 (类似于linux的.bashrc)
    请参见底部的示例cmdrc.cmd文件

注意:下面的 Autorun_ 只是一个占位符键,不会有任何作用。选择一个并重命名另一个。

手动编辑以下路径中的注册表:

[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]

  Autorun    REG_SZ    doskey /macrofile=%userprofile%\cmd\aliases.mac
  Autorun_    REG_SZ    %USERPROFILE%\cmd\cmdrc.cmd

或导入注册表文件:

%userprofile%/cmd/cmd-aliases.reg

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"Autorun"="doskey /macrofile=%userprofile%\\cmd\\aliases.mac"
"Autorun_"="%USERPROFILE%\\cmd\\cmdrc.cmd"

%userprofile%/cmd/cmdrc.cmd 如果您选择了上述b)选项,则无需此文件

该文件路径为"%userprofile%/cmd/cmdrc.cmd"。如果您选择了上述b)选项,则无需此文件。
:: This file is registered via registry to auto load with each instance of cmd.
:: https://dev59.com/-2Ij5IYBdhLWcg3wMiYu#59978163

@echo off
doskey /macrofile=%userprofile%\cmd\aliases.mac

:: put other commands here

cls
echo Hi Qwerty, how are you today?

cmd greetings & aliases


我们需要 "/macrofile" 吗 - 我在上面找不到信息。我得到了 "'/macrofile' 未被识别为内部或外部命令" 的错误提示。 - Galivan
@Galivan 这是 doskey /macrofile - Qwerty
这太棒了,谢谢。 是否也有一种方法可以与PowerShell一起使用? - Utsav Barnwal
@UtsavBarnwal 看起来添加 /exename=powershell.exe 可以使其工作,例如 doskey /exename=powershell.exe /macrofile=%userprofile%\cmd\aliases.mac。但我没有测试过。然后你可以使用桌面快捷方式。如果我们找到正确的注册表键,我敢打赌也有一种方法将其添加到注册表中。https://devblogs.microsoft.com/premier-developer/getting-doskey-macros-to-work-in-powershell/ - Qwerty

11

您希望通过简单地输入来创建别名:

c:\>alias kgs kubectl get svc

Created alias for kgs=kubectl get svc

然后使用别名如下:

c:\>kgs alfresco-svc

NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
alfresco-svc   ClusterIP   10.7.249.219   <none>        80/TCP    8d

只需将以下alias.bat文件添加到您的路径中。它会在与自身相同的目录中创建其他批处理文件。

  @echo off
  echo.
  for /f "tokens=1,* delims= " %%a in ("%*") do set ALL_BUT_FIRST=%%b
  echo @echo off > C:\Development\alias-script\%1.bat
  echo echo. >> C:\Development\alias-script\%1.bat
  echo %ALL_BUT_FIRST% %%* >> C:\Development\alias-script\%1.bat
  echo Created alias for %1=%ALL_BUT_FIRST%

这创建的批处理文件的一个示例名为kgs.bat

@echo off 
echo. 
kubectl get svc %* 

1
请注意:将上面的“C:\Development\alias-script\”替换为“%~dp0\”。 - alexbk66

6
实际上,我会分享一个小技巧,自从我还在Amiga上编程时就一直使用。在任何你使用的新系统上,无论是个人还是专业的,第一步都是创建两个文件夹:C:\BINC:\BATCH。然后修改你的路径语句,将它们按照顺序放在开头:C:\BATCH;C:\BIN;[剩余路径]
这样做之后,如果你有一些需要访问的小型实用程序,只需将它们复制到C:\BIN文件夹中,它们就在你的路径中了。如果想要暂时覆盖这些分配,可以在C:\BATCH文件夹中添加与可执行文件同名的批处理文件,路径会在C:\BIN文件夹中的文件之前找到它。这应该涵盖你可能需要做的任何事情。
当然,现在正确的做法是创建符号链接到文件,但是同样的原理适用。还有一个额外的好处是,如果你想将某些东西放入系统中,但与路径中已经存在的某些内容冲突,将其放入C:\BINC:\Batch文件夹中将简单地预先占据原来的位置——允许你临时或永久地覆盖这些内容,或将它们重命名为你更熟悉的名称——而不会实际修改原始文件。

1
这个答案和roryhewitt的一样。 - Jean-François Fabre
2
实际上不是这样的。 我说“更好的一个”。 内置选项可以覆盖或低于已经存在的覆盖。 将可执行文件与批处理文件简单分离。 而Rory的解决方案没有明确指定要将文件夹放在路径中的哪个位置。 因此,大多数人会将它放在路径的末尾。 他的解决方案位于末尾而不是开头,因此将无法首先允许覆盖。 Rory的解决方案与我自己最初达到的相似-25年前。 我现在已经对模型进行了一些改进。 - David
3
随便。使用Amiga的人不可能都是坏人。 - Jean-François Fabre
好的 :) 在我的情况下,别名文件夹位于路径的开头,但无论如何,我个人不想覆盖默认设置 - 我的别名总是有不同的名称。因此,我使用“dig2”和“digx”作为“dig”的别名,但仍然可以使用“dig”(无需指定其文件夹)。此外,Amiga +1 :) - roryhewitt
美好的回忆,我还将批处理文件重命名为startup-sequence :) - Erdinç Çorbacı

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接