it-swarm-id.com

Setara dengan * Nix perintah 'yang' di PowerShell?

Bagaimana cara saya bertanya pada PowerShell di mana ada sesuatu? 

Misalnya, "notepad mana" dan mengembalikan direktori tempat notepad.exe dijalankan sesuai dengan jalur saat ini.

308
DevelopingChris

Alias ​​pertama yang saya buat setelah saya mulai menyesuaikan profil saya di PowerShell adalah 'yang'.

New-Alias which get-command

Untuk menambahkan ini ke profil Anda, ketikkan ini:

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

`N pada awal baris terakhir adalah untuk memastikannya akan dimulai sebagai baris baru.

305
halr9000

Berikut ini adalah ekivalen * nix aktual, yaitu memberikan * nix-style output.

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

Ganti saja dengan apa pun yang Anda cari.

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

Ketika Anda menambahkannya ke profil Anda, Anda akan ingin menggunakan fungsi daripada alias karena Anda tidak dapat menggunakan alias dengan pipa:

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

Sekarang, ketika Anda memuat ulang profil Anda, Anda dapat melakukan ini:

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

Saya biasanya cukup mengetik:

gcm notepad

atau

gcm note*

gcm adalah alias default untuk Get-Command.

Pada sistem saya, gcm note * output:

[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

Anda mendapatkan direktori dan perintah yang cocok dengan apa yang Anda cari.

72
David Mohundro

Coba contoh ini:

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

Ini tampaknya melakukan apa yang Anda inginkan (saya menemukannya di 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

Periksa ini PowerShell Yang .

Kode yang disediakan di sana menyarankan ini:

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

Proposisi saya untuk fungsi Mana:

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

PS C:\> which devcon

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

Coba perintah where pada Windows 2003 atau lebih baru (atau Windows 2000/XP jika Anda telah menginstal Resource Kit). 

BTW, ini menerima lebih banyak jawaban dalam pertanyaan lain:

Apakah ada yang setara dengan 'yang' pada Windows?

PowerShell setara dengan Unix which perintah?

2
Anonymous

Pertandingan cepat dan kotor untuk Unix which adalah

New-Alias which where.exe

Tetapi mengembalikan beberapa baris jika ada sehingga menjadi

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

Saya suka Get-Command | Format-List, atau lebih pendek, menggunakan alias untuk keduanya dan hanya untuk powershell.exe:

gcm powershell | fl

Anda dapat menemukan alias seperti ini:

alias -definition Format-List

Penyelesaian tab berfungsi dengan gcm.

1
js2010

Saya memiliki fungsi lanjutan which ini di profil PowerShell saya:

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

Menggunakan:

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

Atau versi ini, memanggil perintah asli di mana.

Versi ini juga berfungsi lebih baik, karena tidak terbatas pada file 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