पॉवरशेल में 'निक्स' के समतुल्य है?


404

मैं PowerShell से कैसे पूछूं कि कुछ कहाँ है?

उदाहरण के लिए, "कौन सा नोटपैड" और यह उस निर्देशिका को वापस करता है जहां नोटपैड.एड मौजूदा रास्तों के अनुसार चलाया जाता है।

जवाबों:


390

एक बार जब मैंने PowerShell में अपनी प्रोफ़ाइल को कस्टमाइज़ करना शुरू किया, तब मैंने जो किया था, वह 'जो' था।

New-Alias which get-command

इसे अपनी प्रोफ़ाइल में जोड़ने के लिए, यह लिखें:

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

अंतिम पंक्ति के प्रारंभ में `n यह सुनिश्चित करना है कि यह एक नई पंक्ति के रूप में शुरू होगा।


1
आप इसे अपनी प्रोफाइल स्क्रिप्ट में डाल सकते हैं। प्रोफाइल पर अधिक - msdn.microsoft.com/en-us/library/bb613488(VS.85).aspx
स्टीवन

61
मुझे दौड़ना पसंद है: Get-Command <command> | Format-Table Path, Nameइसलिए मुझे वह रास्ता मिल सकता है जहां कमांड भी बैठता है।
jrsconfitto

4
क्या हर समय टाइप किए बिना कोई रास्ता है '| प्रारूप-तालिका पथ, नाम '?
गिलियूम

10
यदि आप चाहते हैं कि यूनिक्स-शैली का व्यवहार आपको वह रास्ता प्रदान करे जिसके लिए आपको गेट-कमांड के आउटपुट को पाइप करना होगा select -expandproperty Path
केसी

5
(gcm <command>).definitionकेवल पथ प्राप्त करने के लिए उपयोग करें । gcmके लिए डिफ़ॉल्ट उपनाम है Get-Command। आप वाइल्डकार्ड का भी उपयोग कर सकते हैं, जैसे (gcm win*.exe).definition:।
सचिन जोसेफ

165

यहाँ एक वास्तविक * nix समतुल्य है, अर्थात यह * nix-style आउटपुट देता है।

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

जो भी आप खोज रहे हैं, उसके साथ बस बदलें।

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

जब आप इसे अपनी प्रोफ़ाइल में जोड़ते हैं, तो आप एक उपनाम के बजाय एक फ़ंक्शन का उपयोग करना चाहेंगे क्योंकि आप पाइप के साथ उपनाम का उपयोग नहीं कर सकते हैं:

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

अब, जब आप अपना प्रोफ़ाइल पुनः लोड करते हैं तो आप ऐसा कर सकते हैं:

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

22
"(प्राप्त करें-कमान नोटपैड) .definition": मैं इस वैकल्पिक सिंटैक्स का उपयोग करें
यान

2
@ B00merang आपका सिंटैक्स महान है - निश्चित रूप से अधिक संक्षिप्त - लेकिन दुर्भाग्य से, यहां तक ​​कि हटाए गए पाइप के साथ भी, इसे एक उपनाम के रूप में नहीं जोड़ा जा सकता है जब तक कि आप उस प्रोग्राम का नाम शामिल नहीं करते हैं जिसे आप खोज रहे हैं।
पेट्र्स

4
यह एक पुरानी पोस्ट है, लेकिन अगर किसी को Google द्वारा भेजा गया है (जैसे मैं था), यह उत्तर स्वीकृत उत्तर की तुलना में अधिक प्रकार के पॉवर्सशेल कमांड के साथ काम करता है। उदाहरण के लिए, मेरे पास एक उपनाम oktaहै जो पॉवर्सशेल लिपि को इंगित करता है जिसका नाम okta.ps1मेरे पर नहीं है $PATH। स्वीकृत उत्तर का उपयोग करके स्क्रिप्ट नाम ( okta -> okta.ps1) लौटाता है । यह ठीक है, लेकिन यह मुझे का स्थान नहीं बताता है okta.ps1। हालांकि, इस उत्तर का उपयोग करने से मुझे पूरा रास्ता मिल जाता है ( C:\Users\blah\etc\scripts\okta.ps1)। तो + क मुझसे।
स्काई --- कप्तान

87

मैं आमतौर पर सिर्फ टाइप करता हूं:

gcm notepad

या

gcm note*

gcm गेट-कमांड के लिए डिफ़ॉल्ट उपनाम है।

मेरे सिस्टम पर, gcm नोट * आउटपुट:

[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

आपको वह निर्देशिका और कमांड मिलती है, जो आप खोज रहे हैं।


यह थोड़ा गड़बड़ है, लेकिन कस्टम कार्यों और मनमानी विभाजन की तुलना में साफ-सुथरा है
विकासशील

1
जब मैं अपने पॉवरशेल कमांड प्रॉम्प्ट में "gcm नोटपैड" टाइप करता हूं, तो मुझे पहले दो कॉलम मिलते हैं, और एक तीसरा कॉलम 'ModuleName' कहा जाता है, जो खाली है। क्या आप जानते हैं कि डिफ़ॉल्ट रूप से 'परिभाषा' कॉलम को सूचीबद्ध करने के लिए इसे कैसे मजबूर करना है?
पीयूष सोनी

3
@PiyushSoni कि शायद PowerShell के एक अद्यतन संस्करण के कारण। आप हमेशा कुछ ऐसा करके अन्य कॉलम प्रदर्शित कर सकते हैं gcm note* | select CommandType, Name, Definition। यदि आप इसे अक्सर चलाते हैं, तो आपको संभवतः इसे एक फ़ंक्शन में लपेटना चाहिए, हालांकि।
डेविड मोहुंद्रो 18

40

इस उदाहरण का प्रयास करें:

(Get-Command notepad.exe).Path

2
कृपया अधिक कोड या स्पष्टीकरण जोड़ें ताकि ओपी आपको बेहतर समझ सके। धन्यवाद।
sshashank124

3
कम कोड जोड़ने के लिए धन्यवाद, इसलिए मैं वास्तव में एक बार के लिए इसे याद कर सकता हूं: पी
अल्बर्टन

1
मुझे यही चाहिए था! यह gcm के साथ भी काम करता है:(gcm py.exe).path
बिल ऐज

7

किस समारोह के लिए मेरा प्रस्ताव:

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

PS C:\> which devcon

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

यह स्वीकार किए गए से बेहतर उत्तर है। यह आपको बेहतर उत्पादन प्रदान करने के लिए ऊपर दिए गए पोस्टप्रोसेसिंग प्रत्ययों को जोड़ने की अनुमति देता है; एक उपनाम नहीं है।
BobHy

5

यूनिक्स के लिए एक त्वरित और गंदा मैच whichहै

New-Alias which where.exe

लेकिन यह कई लाइनों को लौटाता है यदि वे मौजूद हैं तो यह बन जाता है

function which {where.exe command | select -first 1}

1
where.exe whereआपको बताना चाहिएC:\Windows\System32\where.exe
क्रिस एफ कैरोल

1
where.exeके बराबर है which -a, क्योंकि यह सभी मिलान निष्पादन योग्य को वापस देगा , न कि केवल पहले निष्पादित होने वाला। वह है, where.exe notepadदेता है c:\windows\notepad.exeऔर c:\windows\system32\notepad.exe। इसलिए यह फॉर्म के लिए विशेष रूप से उपयुक्त नहीं है$(which command) । (एक और समस्या यह है कि यह एक अच्छा, उपयोगी त्रुटि संदेश प्रिंट करेगा यदि कमांड नहीं मिला है, जो अच्छी तरह से विस्तार नहीं करेगा $()- जिसे इसके साथ रीमेड किया जा सकता है /Q, लेकिन एक उपनाम के रूप में नहीं।)
जीरोने मोर्टर्ट

मुद्दा लेना। मैंने उत्तर संपादित किया, लेकिन हाँ यह अब इतना साफ नहीं है
क्रिस एफ कैरोल

1
कृपया ध्यान दें कि whereसिस्टम PATH वैरिएबल को खोजता है और वर्तमान शेल PATH वैरिएबल को नहीं। इस प्रश्न को
लियोनार्डो

3

ऐसा लगता है कि आप क्या चाहते हैं (मैंने इसे 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

लेकिन यह वास्तव में "जो" नहीं है क्योंकि यह किसी भी फ़ाइल (प्रकार) के साथ काम करता है और cmdlets, फ़ंक्शन या उपनाम नहीं
खोजता है

3

इस PowerShell की जाँच करें जो

वहां दिया गया कोड यह बताता है:

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

2
मुझे पता है कि यह वर्षों से है, लेकिन मेरे पथ में "% systemroot% \ system32 \ ..." था और PowerShell उस पर्यावरण चर का विस्तार नहीं करता है और ऐसा करने में त्रुटियों को फेंकता है।
TessellatingHeckler

3

मुझे पसंद है Get-Command | Format-Listया छोटा है, केवल दो के लिए उपनाम का उपयोग कर रहा है powershell.exe:

gcm powershell | fl

आप इस तरह से उपनाम पा सकते हैं:

alias -definition Format-List

टैब पूरा होने के साथ काम करता है gcm


2

की कोशिश whereयदि आपने एक संसाधन किट स्थापित की है, तो Windows 2003 या बाद में (या Windows 2000 / XP पर) कमांड का ।

BTW, यह अन्य सवालों में अधिक जवाब मिला:

क्या विंडोज पर 'जो' के बराबर है?

PowerShell यूनिक्स whichकमांड के बराबर है ?


4
whereWhere-ObjectPowershell में कमांडलेट के लिए उपनाम , इसलिए where <item>Powershell प्रॉम्प्ट में टाइप करने से कुछ भी नहीं होता है। यह उत्तर इस प्रकार पूरी तरह से गलत है - जैसा कि पहले लिंक किए गए प्रश्न में स्वीकृत उत्तर में उल्लेखित है, डॉस प्राप्त करने के लिए where, आपको टाइप करना होगा where.exe <item>
इयान केम्प

0

मेरे पास whichअपने PowerShell प्रोफ़ाइल में यह उन्नत फ़ंक्शन है:

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

उपयोग:

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

या यह संस्करण, जहां कमांड को मूल कहते हैं।

यह संस्करण भी बेहतर काम करता है, क्योंकि यह बल्लेबाजी फ़ाइलों तक सीमित नहीं है:

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

यदि आप एक ऐसा कॉम्बैंड चाहते हैं कि दोनों पाइपलाइन या पैरामाटर से इनपुट स्वीकार करें, तो आपको यह कोशिश करनी चाहिए:

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

अपने प्रोफ़ाइल में कमांड को कॉपी-पेस्ट करें ( notepad $profile)।

उदाहरण:

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

 which clang.exe
C:\Program Files\LLVM\bin\clang.exe
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.