路径中的.cmd与.ps1

时间:2017-12-17 21:52:44

标签: powershell batch-file path scripting

我在路径中添加了一个文件夹,其中包含foo.cmd批处理文件和foo.ps1 powershell脚本。 (批处理文件用于运行带有绕过执行策略的powershell脚本。)

在powershell /命令提示符下运行

> foo

它优先于foo.ps1运行foo.cmd,这与我想要的相反。有没有办法解决这个问题,而无需输入> foo.cmd

1 个答案:

答案 0 :(得分:4)

PowerShell中的

Command precedence定义如下:

  

如果未指定路径,PowerShell在运行命令时将使用以下优先顺序:

     
      
  1. 别名
  2.   
  3. 功能
  4.   
  5. Cmdlet的
  6.   
  7. 原生Windows命令
  8.         

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

然后,PATHPATHEXT环境变量控制外部(“本机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}}