517 Stimmen

Äquivalent zum *Nix-Befehl "which" in PowerShell?

Wie kann ich PowerShell fragen, wo etwas ist?

Zum Beispiel: "which notepad" und es wird das Verzeichnis zurückgegeben, in dem die notepad.exe entsprechend den aktuellen Pfaden ausgeführt wird.

2voto

Amin Punkte 832

Wenn Sie einen Comamnd wollen, der sowohl Input aus der Pipeline als auch als Parameter akzeptiert, sollten Sie dies versuchen:

function which($name) {
    if ($name) { $input = $name }
    Get-Command $input | Select-Object -ExpandProperty Path
}

Kopieren und Einfügen des Befehls in Ihr Profil ( notepad $profile ).

Beispiele:

 echo clang.exe | which
C:\Program Files\LLVM\bin\clang.exe

 which clang.exe
C:\Program Files\LLVM\bin\clang.exe

1voto

Jeff Zeitlin Punkte 8669

Ich habe diese which erweiterte Funktion in meinem PowerShell-Profil:

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

0voto

Jerome Punkte 190

Verwendung:

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

Oder diese Version, die den ursprünglichen where-Befehl aufruft.

Diese Version funktioniert auch besser, weil sie nicht auf bat-Dateien beschränkt ist:

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

0voto

George Ogden Punkte 400

Sie können die which Befehl von https://goprogram.co.uk/software/commands zusammen mit allen anderen UNIX-Befehlen.

0voto

blenderfreaky Punkte 637

Wenn Sie eine Schaufel können Sie einen direkten Klon davon installieren:

scoop install which
which notepad

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X