相当于*Nix'在PowerShell中的命令?

Dev*_*ris 363 unix powershell command

我如何询问PowerShell的位置?

例如,"notepad",它根据当前路径返回运行notepad.exe的目录.

hal*_*000 350

一旦我开始在PowerShell中自定义我的配置文件,我创建的第一个别名是'which'.

New-Alias which get-command
Run Code Online (Sandbox Code Playgroud)

要将此添加到您的个人资料,请输入以下内容

"`nNew-Alias which get-command" | add-content $profile
Run Code Online (Sandbox Code Playgroud)

最后一行开头的`n是确保它将作为新行开始.

  • 我喜欢运行:`Get-Command <command> | 格式 - 表路径,名称`所以我可以得到命令所在的路径. (58认同)
  • 函数($ cmd){get-command $ cmd | 选择路径} (20认同)
  • 如果你想要给你提供路径的Unix风格的行为,你需要将get-command的输出传递给`select -expandproperty Path`. (8认同)
  • 使用 `(gcm &lt;command&gt;).definition` 仅获取路径。`gcm` 是 `Get-Command` 的默认别名。您还可以使用通配符,例如:`(gcm win*.exe).definition`。 (7认同)
  • 有没有办法让路径一直没有输入'| 格式 - 表路径,名称'? (4认同)

pet*_*snd 152

这是一个实际的*nix等价物,即它给出了*nix风格的输出.

Get-Command <your command> | Select-Object -ExpandProperty Definition
Run Code Online (Sandbox Code Playgroud)

只需替换你想要的任何东西.

PS C:\> Get-Command notepad.exe | Select-Object -ExpandProperty Definition
C:\Windows\system32\notepad.exe
Run Code Online (Sandbox Code Playgroud)

将其添加到配置文件时,您将需要使用函数而不是别名,因为您不能对管道使用别名:

function which($name)
{
    Get-Command $name | Select-Object -ExpandProperty Definition
}
Run Code Online (Sandbox Code Playgroud)

现在,当您重新加载配置文件时,您可以执行以下操作:

PS C:\> which notepad
C:\Windows\system32\notepad.exe
Run Code Online (Sandbox Code Playgroud)

  • 我使用这种替代语法:"(Get-Command notepad).definition" (16认同)
  • 这是一篇旧帖子,但如果有人被谷歌发送到这里(就像我一样),这个答案适用于比接受的答案更多类型的 Powershell 命令。例如,我有一个名为 `okta` 的别名,它指向一个名为 `okta.ps1` 的 Powershell 脚本,该脚本不在我的 `$PATH` 中。使用接受的答案返回脚本名称(`okta -&gt; okta.ps1`)。这没问题,但它没有告诉我 `okta.ps1` 的位置。然而,使用这个答案给了我整个路径(`C:\Users\blah\etc\scripts\okta.ps1`)。所以我+1。 (5认同)
  • @ B00merang您的语法很棒-绝对更加简洁-但不幸的是,即使删除了管道,也不能将其作为别名添加,除非您包含要查找的程序的名称。 (2认同)

Dav*_*dro 80

我通常只输入:

gcm notepad
Run Code Online (Sandbox Code Playgroud)

要么

gcm note*
Run Code Online (Sandbox Code Playgroud)

gcm是Get-Command的默认别名.

在我的系统上,gcm note*输出:

[27] » gcm note*

CommandType     Name                                                     Definition
-----------     ----                                                     ----------
Application     notepad.exe                                              C:\WINDOWS\notepad.exe
Application     notepad.exe                                              C:\WINDOWS\system32\notepad.exe
Application     Notepad2.exe                                             C:\Utils\Notepad2.exe
Application     Notepad2.ini                                             C:\Utils\Notepad2.ini
Run Code Online (Sandbox Code Playgroud)

您将获得与您要查找的目录和命令相匹配的目录和命令.

  • @PiyushSoni,可能是因为PowerShell的更新版本.您可以通过执行类似`gcm note*|的操作来显示其他列 选择CommandType,Name,Definition`.如果你经常运行它,你应该把它包装在一个函数中. (3认同)

小智 36

试试这个例子:

(Get-Command notepad.exe).Path
Run Code Online (Sandbox Code Playgroud)

  • 感谢您添加更少的代码,因此我实际上可以记住这一次:P (3认同)
  • 请添加更多代码或说明,以便OP可以更好地了解您。谢谢。 (2认同)

js2*_*010 7

我喜欢Get-Command | Format-List或更短地使用两者的别名,并且仅用于powershell.exe

gcm powershell | fl
Run Code Online (Sandbox Code Playgroud)

您可以这样查找别名:

alias -definition Format-List
Run Code Online (Sandbox Code Playgroud)

制表符补全适用于gcm.

要让选项卡一次列出所有选项:

set-psreadlineoption -editmode emacs
Run Code Online (Sandbox Code Playgroud)


Chr*_*oll 6

与 Unix 的快速而肮脏的匹配which

New-Alias which where.exe
Run Code Online (Sandbox Code Playgroud)

但是如果它们存在,它会返回多行,所以它变成

function which {where.exe command | select -first 1}
Run Code Online (Sandbox Code Playgroud)

  • `where.exe` 等价于 `which -a`,因为它将返回*所有*匹配的可执行文件,而不仅仅是第一个要执行的。也就是说,`where.exe notepad` 给出了 `c:\windows\notepad.exe` 和 `c:\windows\system32\notepad.exe`。所以这特别*不*适用于`$(which command)`形式。(另一个问题是,如果找不到该命令,它将打印一个很好的、有用的错误消息,这也不会在 `$()` 中很好地扩展——这可以用 `/Q` 来补救,但不能作为别名.) (3认同)

小智 5

我对Who函数的主张:

function which($cmd) { get-command $cmd | % { $_.Path } }

PS C:\> which devcon

C:\local\code\bin\devcon.exe
Run Code Online (Sandbox Code Playgroud)