我在路径中添加了一个文件夹,其中包含foo.cmd
批处理文件和foo.ps1
powershell脚本。 (批处理文件用于运行带有绕过执行策略的powershell脚本。)
在powershell /命令提示符下运行
> foo
它优先于foo.ps1
运行foo.cmd
,这与我想要的相反。有没有办法解决这个问题,而无需输入> foo.cmd
?
答案 0 :(得分:4)
Command precedence定义如下:
如果未指定路径,PowerShell在运行命令时将使用以下优先顺序:
- 别名
- 功能
- Cmdlet的
- 原生Windows命令
醇>因此,如果键入“help”,PowerShell首先会查找名为“help”的别名,然后查找名为“Help”的函数,最后查找名为“Help”的cmdlet。它运行它找到的第一个“帮助”项。
然后,PATH
和PATHEXT
环境变量控制外部(“本机Windows”)命令的优先级。前者列出Windows搜索外部命令的目录是未使用(相对或绝对)路径调用的命令,后者列出了在未找到匹配项时Windows将自动附加的扩展名。对于每个环境变量,第一个匹配获胜,这意味着如果您有一个PATH列表C:\foo;C:\bar
并且具有如下文件夹结构:
C: ├─bar │ └─a.exe └─foo ├─a.cmd └─a.vbs
当您调用C:\foo\a.cmd
命令(没有路径或扩展名)时,Windows将执行a
,因为C:\foo
中的PATH
位于.cmd
并且.vbs
来了在PATHEXT
变量中的$env:PATHEXT
之前。
但是,就PowerShell而言,PowerShell脚本似乎位于cmdlet和外部命令之间,因为它们的扩展名未在@echo off
set "suffix=-bar"
powershell.exe -ExecutionPolicy ByPass -File "%~dpn0%suffix%.ps1"
中列出,但您不能使用同名的PowerShell脚本取代内置cmdlet 。但是,我无法找到关于此的文档。
结论:我认为您要么必须使用扩展名调用批处理脚本,要么重命名PowerShell脚本。后者可以通过在文件的基本名称后附一个固定的后缀来完成,然后从批处理脚本中调用它,如下所示:
{{1}}