मैं PowerShell से कैसे पूछूं कि कुछ कहाँ है?
उदाहरण के लिए, "कौन सा नोटपैड" और यह उस निर्देशिका को वापस करता है जहां नोटपैड.एड मौजूदा रास्तों के अनुसार चलाया जाता है।
मैं PowerShell से कैसे पूछूं कि कुछ कहाँ है?
उदाहरण के लिए, "कौन सा नोटपैड" और यह उस निर्देशिका को वापस करता है जहां नोटपैड.एड मौजूदा रास्तों के अनुसार चलाया जाता है।
जवाबों:
एक बार जब मैंने PowerShell में अपनी प्रोफ़ाइल को कस्टमाइज़ करना शुरू किया, तब मैंने जो किया था, वह 'जो' था।
New-Alias which get-command
इसे अपनी प्रोफ़ाइल में जोड़ने के लिए, यह लिखें:
"`nNew-Alias which get-command" | add-content $profile
अंतिम पंक्ति के प्रारंभ में `n यह सुनिश्चित करना है कि यह एक नई पंक्ति के रूप में शुरू होगा।
Get-Command <command> | Format-Table Path, Name
इसलिए मुझे वह रास्ता मिल सकता है जहां कमांड भी बैठता है।
select -expandproperty Path
।
(gcm <command>).definition
केवल पथ प्राप्त करने के लिए उपयोग करें । gcm
के लिए डिफ़ॉल्ट उपनाम है Get-Command
। आप वाइल्डकार्ड का भी उपयोग कर सकते हैं, जैसे (gcm win*.exe).definition
:।
यहाँ एक वास्तविक * 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
okta
है जो पॉवर्सशेल लिपि को इंगित करता है जिसका नाम okta.ps1
मेरे पर नहीं है $PATH
। स्वीकृत उत्तर का उपयोग करके स्क्रिप्ट नाम ( okta -> okta.ps1
) लौटाता है । यह ठीक है, लेकिन यह मुझे का स्थान नहीं बताता है okta.ps1
। हालांकि, इस उत्तर का उपयोग करने से मुझे पूरा रास्ता मिल जाता है ( C:\Users\blah\etc\scripts\okta.ps1
)। तो + क मुझसे।
मैं आमतौर पर सिर्फ टाइप करता हूं:
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
आपको वह निर्देशिका और कमांड मिलती है, जो आप खोज रहे हैं।
gcm note* | select CommandType, Name, Definition
। यदि आप इसे अक्सर चलाते हैं, तो आपको संभवतः इसे एक फ़ंक्शन में लपेटना चाहिए, हालांकि।
इस उदाहरण का प्रयास करें:
(Get-Command notepad.exe).Path
(gcm py.exe).path
किस समारोह के लिए मेरा प्रस्ताव:
function which($cmd) { get-command $cmd | % { $_.Path } }
PS C:\> which devcon
C:\local\code\bin\devcon.exe
यूनिक्स के लिए एक त्वरित और गंदा मैच which
है
New-Alias which where.exe
लेकिन यह कई लाइनों को लौटाता है यदि वे मौजूद हैं तो यह बन जाता है
function which {where.exe command | select -first 1}
where.exe where
आपको बताना चाहिएC:\Windows\System32\where.exe
where.exe
के बराबर है which -a
, क्योंकि यह सभी मिलान निष्पादन योग्य को वापस देगा , न कि केवल पहले निष्पादित होने वाला। वह है, where.exe notepad
देता है c:\windows\notepad.exe
और c:\windows\system32\notepad.exe
। इसलिए यह फॉर्म के लिए विशेष रूप से उपयुक्त नहीं है$(which command)
। (एक और समस्या यह है कि यह एक अच्छा, उपयोगी त्रुटि संदेश प्रिंट करेगा यदि कमांड नहीं मिला है, जो अच्छी तरह से विस्तार नहीं करेगा $()
- जिसे इसके साथ रीमेड किया जा सकता है /Q
, लेकिन एक उपनाम के रूप में नहीं।)
where
सिस्टम PATH वैरिएबल को खोजता है और वर्तमान शेल PATH वैरिएबल को नहीं। इस प्रश्न को
ऐसा लगता है कि आप क्या चाहते हैं (मैंने इसे 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
इस PowerShell की जाँच करें जो ।
वहां दिया गया कोड यह बताता है:
($Env:Path).Split(";") | Get-ChildItem -filter notepad.exe
की कोशिश where
यदि आपने एक संसाधन किट स्थापित की है, तो Windows 2003 या बाद में (या Windows 2000 / XP पर) कमांड का ।
BTW, यह अन्य सवालों में अधिक जवाब मिला:
where
Where-Object
Powershell में कमांडलेट के लिए उपनाम , इसलिए where <item>
Powershell प्रॉम्प्ट में टाइप करने से कुछ भी नहीं होता है। यह उत्तर इस प्रकार पूरी तरह से गलत है - जैसा कि पहले लिंक किए गए प्रश्न में स्वीकृत उत्तर में उल्लेखित है, डॉस प्राप्त करने के लिए where
, आपको टाइप करना होगा where.exe <item>
।
मेरे पास 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 }
}
}
उपयोग:
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'
}
यदि आप एक ऐसा कॉम्बैंड चाहते हैं कि दोनों पाइपलाइन या पैरामाटर से इनपुट स्वीकार करें, तो आपको यह कोशिश करनी चाहिए:
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