【问题标题】:Change the order of executable commands on Windows在 Windows 上更改可执行命令的顺序
【发布时间】:2020-04-30 12:59:15
【问题描述】:

有时我需要更改仅共享名称的可执行命令的顺序。让我给你看一个简单的例子:

λ where find
C:\Windows\System32\find.exe
C:\Program Files\Git\usr\bin\find.exe
C:\cygwin64\bin\find.exe

在这种情况下,调用的是 Windows 的“查找”命令,而不是其他两个 (GNU findutils)。我的问题很简单:更改顺序或将其中一个设置为第一首选项的正确方法是什么?

【问题讨论】:

  • 先打赢,放上你想要的路就可以了
  • 在 Windows 8/10 上,当您从环境变量编辑路径时,您可以使用上移/下移按钮来设置优先级。最上面的那个是首选。 @Marged 已经用不同的方式简单地说过了。
  • 修改@fr0zenfyr 答案:如果您只是暂时需要这个,您可以创建一个执行set path=C:\Windows\System32;... 的脚本。调用它fw.cmd 并在需要时运行它。为 git 和 cygwin 添加 fg 和 fc。不要忘记其他路径元素!

标签: windows command-line path-variables


【解决方案1】:

转到 Windows 的环境变量定义并复制 PATH 的现有条目。创建一个名为 BASEPATH 的新变量,并将所有 不属于可以找到 find.exe 的路径列表的条目放入其中。

现在创建一个名为 fwin.cmd 的文件并将其放在 PATH 中的某个位置。该文件的内容如下所示:

@echo off
SET PATH=C:\windows\system32;%BASEPATH%
ECHO Set path to search tools like find in Windows own folder

创建两个文件 fgit.cmdfcyg.cmd 并相应地更改 PATH。

不时额外安装的应用程序会更改您的PATH。如果是这种情况,您需要将新条目添加到 BASEPATH

根据你想要的find.exe,打开一个Windows的命令行shell,调用对应的cmd文件。批处理设置的路径对于打开的 shell 来说是本地的,一旦你关闭它,设置就会消失。

您也可以直接处理所需的 find.exe,但这意味着更多的输入,并且可能不是您想要的:

dir C:\ /S | C:\Windows\System32\find.exe foo

【讨论】:

  • 目录可以在PATH 中重复,所以只需添加所需的目录,例如set "PATH=C:\Program Files\Git\usr\bin;%PATH%".
  • 一般来说,一个人可能有一组可执行文件需要切换,而无法安排PATH 以匹配该组而不发生冲突。这可以通过在公共目录中创建(或复制/符号链接到)公共目录中的批处理脚本包装器或 .LNK 外壳链接(即快捷方式)来管理。将“.LNK”添加到PATHEXT 环境变量。将链接中的起始目录留空,以便在从命令提示符运行时继承工作目录。
  • 如果程序调用CreateProcessW 并允许它搜索可执行文件,那么CreateProcessW 将始终在搜索PATH 之前搜索应用程序目录和系统目录。所以一般我们不能绕过诸如“find.exe”之类的系统可执行文件,除非在应用程序目录(即包含当前进程的可执行文件的目录)中有“find.exe”。 CMD shell 实现了自己的搜索,它只使用PATH,所以在这种情况下我们可以完全控制。
  • @ErykSun 我的目标是描述一个易于实施和理解的解决方案
  • 查看我的第一条评论。不需要BASEPATH。没有它会更简单,并且不需要维护。第二条评论有点复杂,但它解决了PATH 搜索中目录冲突的一般问题(例如,如果两个目录包含许多同名的可执行文件,我们需要来自两个目录的可执行文件)。相反,我们可以为冲突目录创建额外的变量,并始终将其文件作为完全限定路径而不是搜索来访问(例如 "%SPAM_BIN%\eggs.exe")。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2020-03-08
  • 2019-08-19
相关资源
最近更新 更多