it-swarm-tr.com

PowerShell'de * Nix 'hangi' komutunun karşılığı?

PowerShell'e bir şeyin nerede olduğunu nasıl sorabilirim? 

Örneğin, "hangi not defteri" ve notepad.exe dosyasının geçerli yollara göre çalıştırıldığı dizini döndürür.

308
DevelopingChris

Bir keresinde yaptığım ilk takma ad, PowerShell'deki profilimi özelleştirmeye başladım.

New-Alias which get-command

Bunu profilinize eklemek için şunu yazın:

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

Son satırın başındaki `n, yeni bir satır olarak başlamasını sağlamaktır.

305
halr9000

İşte gerçek bir * nix eşdeğeridir, yani * nix tarzı çıktı verir.

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

Sadece aradığın şeyle değiştir.

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

Profilinize eklediğinizde, takma ad yerine bir işlev kullanmak isteyeceksiniz, çünkü boru takma adlarını kullanamazsınız:

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

Şimdi, profilinizi yeniden yüklediğinizde şunları yapabilirsiniz:

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

Genelde sadece şunu yazarım:

gcm notepad

veya

gcm note*

gcm, Get-Command için varsayılan takma addır.

Sistemimde gcm note * çıktıları:

[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

Dizini ve aradığınızla eşleşen komutu alırsınız.

72
David Mohundro

Bu örneği deneyin:

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

Bu istediğini yapmak gibi görünüyor ( http://huddledmasses.org/powershell-find-path/ 'da buldum):

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

Bunu kontrol edin PowerShell Hangi .

Burada verilen kod şunu göstermektedir:

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

Hangi fonksiyon için önerim:

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

PS C:\> which devcon

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

Windows 2003 veya sonraki sürümlerinde where komutunu deneyin (veya bir Kaynak Seti taktıysanız Windows 2000/XP). 

Btw, bu diğer sorularda daha fazla cevap aldı:

Windows'ta 'hangisi' eşdeğeri var mı?

Unix which komutuna eşdeğer PowerShell?

2
Anonymous

Unix which ile hızlı ve kirli maç

New-Alias which where.exe

Fakat eğer varsa çoklu satırları döndürürler.

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

İki ve sadece Get-Command | Format-List için takma ad kullanarak powershell.exe veya daha kısa bir sürümünü seviyorum:

gcm powershell | fl

Bunun gibi takma adları bulabilirsiniz:

alias -definition Format-List

Sekme tamamlama gcm ile çalışır.

1
js2010

PowerShell profilimde bu which advanced işlevine sahibim:

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

Kullanın:

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"
}

Ya da bu sürüm, orijinal where komutunu çağırmak.

Bu sürüm aynı zamanda daha iyi çalışır, çünkü yarasa dosyaları ile sınırlı değildir:

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