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