路径中的.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在运行命令时将使用以下优先顺序:

  1. 别号
  2. 功能
  3. 小命令
  4. 本机Windows命令

因此,如果键入“help”,PowerShell首先会查找名为“help”的别名,然后查找名为“Help”的函数,最后查找名为“Help”的cmdlet。它运行它找到的第一个“帮助”项。

然后,外部(“本机Windows”)命令的优先级由PATHPATHEXT环境变量控制。前者列出Windows搜索外部命令的目录是未使用(相对或绝对)路径调用的命令,后者列出了在未找到匹配项时Windows将自动附加的扩展名。对于每个环境变量,第一个匹配获胜,这意味着如果您有一个列出C:foo;C:ar的PATH并且具有如下文件夹结构:

C:
├─bar
│ └─a.exe
└─foo
  ├─a.cmd
  └─a.vbs

当你调用命令C:fooa.cmd(没有路径或扩展名)时,Windows将执行a,因为C:fooPATH中排在第一位,而.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的主要内容,如果未能解决你的问题,请参考以下文章

powershell 一个ps1 运行

iOS,AVPlayer - 循环播放 MP3 片段

运行 .jar 时的 getResourceAsStream 文件路径

VBA中的FreeFile

为啥将拆分为 wav 文件的旋律转换为拆分的 mp3 会在片段边界处产生不好的声音?

2.系统目录介绍