Jac*_*cek 4 windows git powershell
命令“git”可以从PowerShell获得,我想知道git安装在我的电脑上的哪里,所以我尝试执行这样的“脚本”
PS> where git
Run Code Online (Sandbox Code Playgroud)
但执行后我什么也没看到,只提示输入新命令。问题:如何在 Windows 10 中找到命令路径?
mkl*_*nt0 16
现有的答案很有帮助,但我认为更系统的讨论也很有帮助。
太长了;博士
where是 PowerShell 的cmdlet内置别名Where-Object;要调用外部where.exe 程序,请.exe显式使用:[1]
# Note the use of '.exe' to disambiguate the external 'where.exe' program
# from PowerShell's built-in 'where' alias (for 'Where-Object').
PS> where.exe git
C:\Program Files\Git\cmd\git.exe
Run Code Online (Sandbox Code Playgroud)
where.exe,其目的是返回系统路径中可执行文件的完整路径(在环境变量中列出的目录之一中$env:PATH),与(旧命令处理器)无关cmd:它是Windows 附带的外部可执行文件,并且它可以从任何shell 调用,因此也可以从 PowerShell 调用。
相比之下,cmd确实有所谓的内部命令,实际上只能从 调用cmd,例如mklink; 事实上,cmd您可以用来where <name>推断给定的(正在运行的)命令是否<name>是内部的:如果没有输出,则该命令是内部的(或者根本不存在)。
或者,使用与cmdlet等效且更灵活的 PowerShell 对应项where.exeGet-Command;它返回System.Management.Automation.CommandInfo实例(或派生类的实例),其.Source属性包含表示外部可执行文件的命令信息对象的完整路径:
PS> (Get-Command git).Source
C:\Program Files\Git\cmd\git.exe
Run Code Online (Sandbox Code Playgroud)
笔记:
where.exe仅查找可执行文件,而Get-Command默认情况下查找所有命令类型(别名、函数、cmdlet...) - 请参阅下一节。
与 不同的是Get-Command,where.exe还查找位于当前目录中的可执行文件。Get-Command不会这样做,因为出于安全原因,PowerShell 在设计上不允许仅通过名称调用位于当前目录中的可执行文件-需要路径.\foo(例如, )。
PowerShell 具有不同类型的命令,在名称冲突的情况下,这些命令具有预定义的优先顺序,以确定哪种类型应该是有效命令。
也就是说,如果给定的命令名称匹配两个或多个命令,则它们的类型决定实际调用哪个命令。
此优先级记录在概念about_Command_Precedence帮助主题中;简而言之,这里是按类型降序排列的命令优先级(最高优先级在前):
*.ps1脚本文件 - 请参阅底部部分查看给定名称存在哪些命令类型的一个简单方法是在调用cmdlet时添加开关-AllGet-Command,该开关按优先级降序列出匹配的命令;也就是说,首先列出将通过给定名称实际执行的命令。
PS> Get-Command -All where
CommandType Name Version Source
----------- ---- ------- ------
Alias where -> Where-Object
Application where.exe 10.0.18... C:\WINDOWS\system32\where.exe
Run Code Online (Sandbox Code Playgroud)
where结果显示,cmdlet的内置别名Where-Object(其目的是过滤管道输入)是您提交时的有效命令where,而不是所需的where.exe可执行文件。
鉴于where.exe可执行文件名具有.exe可以将其与别名区分开的扩展名,因此使用文件扩展名where进行调用是最简单的where.exe ,如顶部所示。
如果这是不可能的(例如,在类 Unix 平台上,可执行文件通常没有文件扩展名或者别名隐藏了函数),您可以使用-Type参数来获取感兴趣的命令,并使用&,呼叫操作员:
# Invokes where.exe, as only it is of type 'Application' (external executable)
& (Get-Command -Type Application where) git
Run Code Online (Sandbox Code Playgroud)
如果存在多个基本文件名为 的外部可执行文件,则它将执行最早列出的目录中where的一个- 请参阅下一节。$env:PATH
*.ps1脚本之间的优先级:笔记:
与 PowerShell之间的一个重要区别cmd是,出于安全原因,PowerShell 在设计上不允许您仅通过名称调用.ps1位于当前目录中的外部可执行文件或脚本;为此,您必须使用路径,最简单的情况是在前面添加(或);例如,要调用位于当前目录中的可执行文件,您必须使用.\./foo./foo ...
*.ps1实际上,脚本和其他可执行文件之间的优先级因平台(Windows 与类 Unix 平台)而异,如下所述。
以下讨论假设给定的命令名称未被更高优先级的命令类型(例如别名)所遮蔽,并且解析为外部可执行文件或*.ps1脚本。
优先规则:
当命令名称通过环境变量中列出的目录解析为潜在的多个外部可执行文件或脚本时,将调用位于最早列出的目录中的可执行文件/脚本。*.ps1$env:PATH
如果,在最早的目录中:
给定的名称与可执行文件名(例如,where.exe)或脚本(例如,foo.ps1)完全匹配,没有歧义,并且调用该可执行文件/脚本。
给定的名称不包含文件扩展名(例如,foo),多个可执行文件可以匹配(通过隐含的文件扩展名),并且实际调用的文件确定如下:
在Windows上:
PowerShell 优先考虑自己的脚本,因此如果.ps1存在脚本,则它是有效命令;请注意,.ps1脚本是在进程内执行的,这与外部可执行文件不同,外部可执行文件总是在子进程中运行。
否则,为环境变量中可执行扩展名中最早列出扩展名的$env:PATHEXT可执行文件;例如,foo.bat优先于foo.vbs,因为,.BAT列在 之前.VBS。
在类 Unix 平台(Linux、macOS)上:
类 Unix 平台仅通过权限确定可执行性,而不是通过文件扩展名,并且在绝大多数情况下,可执行文件没有文件扩展名(例如,只是git,而不是git.exe像 Windows 上那样)。
从 PowerShell 的角度来看,与 Unix 上的可执行性相关的唯一文件扩展名是.ps1,因为PowerShell 本身认为此类文件是可执行的 - 无论它们是否从系统的角度来看。
因此,在 Unix 上的 PowerShell 中,.ps1是唯一可以在调用时省略的隐含文件扩展名;foo.ps1例如,您可以直接调用脚本文件foo(假设它位于系统路径中)。
如果您有一个外部可执行文件,其文件名没有文件扩展名(这是典型的情况),并且.ps1在同一目录中具有相同基本名称的文件,则外部可执行文件优先 - 原因是扩展名 - less name 与无扩展名的可执行文件名完全匹配。
foo和foo.ps1位于同一(最早的)目录中,则提交foo将调用外部可执行文件,而不是foo.ps1- 与 Windows 上不同。笔记:
当使用显式路径(没有文件扩展名)时,给定目录中多个可执行文件之间的优先级规则也适用;例如,调用./foo决定当前目录中多个可执行文件的优先级,其基本名称foo如上所述。
将脚本放置.ps1在列出的目录中$env:PATH并仅通过(基本)名称调用它们并不那么常见,尽管值得考虑作为将潜在的许多函数放入文件中的替代方法$PROFILE。
Get-Foo.ps1,则仅Get-Foo适用于调用,不适用于get-foo.[1] 至于为什么诸如where git- 即错误使用Where-Object- 之类的调用不会产生输出:该调用相当于Where-Object git,而 又相当于,在没有管道输入到 cmdlet 的Where-Object { $_.git }情况下,根据定义,它永远不会产生输出输出。
| 归档时间: |
|
| 查看次数: |
8596 次 |
| 最近记录: |