it-swarm-vi.tech

Tương đương với lệnh * Nix 'which' trong PowerShell?

Làm cách nào để hỏi PowerShell một cái gì đó ở đâu? 

Ví dụ: "notepad" và nó trả về thư mục nơi notepad.exe được chạy từ các đường dẫn hiện tại.

308
DevelopingChris

Bí danh đầu tiên tôi tạo ra khi tôi bắt đầu tùy chỉnh hồ sơ của mình trong PowerShell là 'cái đó'.

New-Alias which get-command

Để thêm nó vào hồ sơ của bạn, gõ này:

"`nNew-Alias which get-command" | add-content $profile

`N ở đầu dòng cuối cùng là để đảm bảo nó sẽ bắt đầu như một dòng mới.

305
halr9000

Đây là một tương đương * nix thực tế, tức là nó cho đầu ra kiểu * nix.

Get-Command <your command> | Select-Object -ExpandProperty Definition

Chỉ cần thay thế bằng bất cứ điều gì bạn đang tìm kiếm.

PS C:\> Get-Command notepad.exe | Select-Object -ExpandProperty Definition
C:\Windows\system32\notepad.exe

Khi bạn thêm nó vào hồ sơ của mình, bạn sẽ muốn sử dụng một chức năng thay vì bí danh vì bạn không thể sử dụng bí danh với các đường ống:

function which($name)
{
    Get-Command $name | Select-Object -ExpandProperty Definition
}

Bây giờ, khi bạn tải lại hồ sơ của bạn, bạn có thể làm điều này:

PS C:\> which notepad
C:\Windows\system32\notepad.exe
132
petrsnd

Tôi thường chỉ gõ:

gcm notepad

hoặc là

gcm note*

gcm là bí danh mặc định cho Get-Command.

Trên hệ thống của tôi, ghi chú gcm * đầu ra:

[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

Bạn nhận được thư mục và lệnh phù hợp với những gì bạn đang tìm kiếm.

72
David Mohundro

Hãy thử ví dụ này:

(Get-Command notepad.exe).Path
36
thesqldev

Điều này dường như làm những gì bạn muốn (tôi tìm thấy nó trên http://huddledmasses.org/powershell-find-path/ ):

Function Find-Path($Path, [switch]$All = $false, [Microsoft.PowerShell.Commands.TestPathType]$type = "Any")
## You could comment out the function stuff and use it as a script instead, with this line:
#param($Path, [switch]$All = $false, [Microsoft.PowerShell.Commands.TestPathType]$type = "Any")
   if($(Test-Path $Path -Type $type)) {
      return $path
   } else {
      [string[]]$paths = @($pwd);
      $paths += "$pwd;$env:path".split(";")

      $paths = Join-Path $paths $(Split-Path $Path -leaf) | ? { Test-Path $_ -Type $type }
      if($paths.Length -gt 0) {
         if($All) {
            return $paths;
         } else {
            return $paths[0]
         }
      }
   }
   throw "Couldn't find a matching path of type $type"
}
Set-Alias find Find-Path
3
Nicholas

Kiểm tra cái này PowerShell Mà .

Mã được cung cấp ở đó gợi ý điều này:

($Env:Path).Split(";") | Get-ChildItem -filter notepad.exe
3
tzot

Đề xuất của tôi cho chức năng nào:

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

PS C:\> which devcon

C:\local\code\bin\devcon.exe
3
VortiFred

Hãy thử lệnh where trên Windows 2003 trở lên (hoặc Windows 2000/XP nếu bạn đã cài đặt Bộ tài nguyên). 

BTW, điều này nhận được nhiều câu trả lời hơn trong các câu hỏi khác:

Có tương đương với 'cái nào' trên Windows không?

PowerShell tương đương với lệnh Unix which?

2
Anonymous

Một trận đấu nhanh và bẩn với Unix which

New-Alias which where.exe

Nhưng nó trả về nhiều dòng nếu chúng tồn tại như vậy thì nó trở thành

$(where.exe command | select -first 1)
2
Chris F Carroll

Tôi thích Get-Command | Format-List hoặc ngắn hơn, sử dụng bí danh cho cả hai và chỉ cho powershell.exe:

gcm powershell | fl

Bạn có thể tìm thấy bí danh như thế này:

alias -definition Format-List

Hoàn thành tab hoạt động với gcm.

1
js2010

Tôi có chức năng nâng cao which này trong hồ sơ PowerShell của mình:

function which {
<#
.SYNOPSIS
Identifies the source of a PowerShell command.
.DESCRIPTION
Identifies the source of a PowerShell command. External commands (Applications) are identified by the path to the executable
(which must be in the system PATH); cmdlets and functions are identified as such and the name of the module they are defined in
provided; aliases are expanded and the source of the alias definition is returned.
.INPUTS
No inputs; you cannot pipe data to this function.
.OUTPUTS
.PARAMETER Name
The name of the command to be identified.
.EXAMPLE
PS C:\Users\Smith\Documents> which Get-Command

Get-Command: Cmdlet in module Microsoft.PowerShell.Core

(Identifies type and source of command)
.EXAMPLE
PS C:\Users\Smith\Documents> which notepad

C:\WINDOWS\SYSTEM32\notepad.exe

(Indicates the full path of the executable)
#>
    param(
    [String]$name
    )

    $cmd = Get-Command $name
    $redirect = $null
    switch ($cmd.CommandType) {
        "Alias"          { "{0}: Alias for ({1})" -f $cmd.Name, (. { which cmd.Definition } ) }
        "Application"    { $cmd.Source }
        "Cmdlet"         { "{0}: {1} {2}" -f $cmd.Name, $cmd.CommandType, (. { if ($cmd.Source.Length) { "in module {0}" -f $cmd.Source} else { "from unspecified source" } } ) }
        "Function"       { "{0}: {1} {2}" -f $cmd.Name, $cmd.CommandType, (. { if ($cmd.Source.Length) { "in module {0}" -f $cmd.Source} else { "from unspecified source" } } ) }
        "Workflow"       { "{0}: {1} {2}" -f $cmd.Name, $cmd.CommandType, (. { if ($cmd.Source.Length) { "in module {0}" -f $cmd.Source} else { "from unspecified source" } } ) }
        "ExternalScript" { $cmd.Source }
        default          { $cmd }
    }
}
0
Jeff Zeitlin

Sử dụng:

function Which([string] $cmd) {
  $path = (($Env:Path).Split(";") | Select -uniq | Where { $_.Length } | Where { Test-Path $_ } | Get-ChildItem -filter $cmd).FullName
  if ($path) { $path.ToString() }
}

# Check if Chocolatey is installed
if (Which('cinst.bat')) {
  Write-Host "yes"
} else {
  Write-Host "no"
}

Hoặc phiên bản này, gọi lệnh gốc ở đâu.

Phiên bản này cũng hoạt động tốt hơn, vì nó không giới hạn ở các tập tin bat:

function which([string] $cmd) {
  $where = iex $(Join-Path $env:SystemRoot "System32\where.exe $cmd 2>&1")
  $first = $($where -split '[\r\n]')
  if ($first.getType().BaseType.Name -eq 'Array') {
    $first = $first[0]
  }
  if (Test-Path $first) {
    $first
  }
}

# Check if Curl is installed
if (which('curl')) {
  echo 'yes'
} else {
  echo 'no'
}
0
Jerome