* নিক্সের সমান? 'পাওয়ারশেলের কমান্ড' কোনটি?


404

আমি কোথায় পাওয়ারশেলকে জিজ্ঞাসা করব যেখানে কিছু আছে?

উদাহরণস্বরূপ, "যা নোটপ্যাড" এবং এটি সেই ডিরেক্টরিটি দেয় যেখানে নোটপ্যাড.এক্সে বর্তমান পাথ অনুসারে চালিত হয়।

উত্তর:


390

পাওয়ারশেলের আমার প্রোফাইলটি কাস্টমাইজ করা শুরু করার পরে আমি প্রথম প্রথম উপনামটি ছিল 'যা'।

New-Alias which get-command

আপনার প্রোফাইলে এটি যুক্ত করতে, এটি টাইপ করুন:

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

শেষ লাইনের শুরুতে `n এটি একটি নতুন লাইন হিসাবে শুরু হবে তা নিশ্চিত করা।


1
আপনি এটি আপনার প্রোফাইল স্ক্রিপ্টে রাখতে পারেন। প্রোফাইলগুলিতে আরও - এমএসডিএন.মাইক্রোসফটকম /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

এখানে একটি আসল * নিক্স সমতুল্য, যেমন এটি * নিক্স-স্টাইল আউটপুট দেয়।

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
আমি এই বিকল্প সিনট্যাক্সটি ব্যবহার করি: "(গেট-কমান্ড নোটপ্যাড)। সংজ্ঞা"
ইয়ান

2
@ B00merang আপনার বাক্য গঠনটি দুর্দান্ত - অবশ্যই আরও সংক্ষিপ্ত - তবে দুর্ভাগ্যক্রমে, এমনকি পাইপটি সরিয়ে দিয়েও, আপনি যে প্রোগ্রামটির সন্ধান করছেন তার নাম অন্তর্ভুক্ত না করা পর্যন্ত এটি একটি উপ নাম হিসাবে যুক্ত করা যাবে না।
পেট্রসেন্ড

4
এটি একটি পুরানো পোস্ট, তবে গুগলের মাধ্যমে যে কেউ এখানে পাঠানো হয়েছে (যেমন আমি ছিলাম), এই উত্তরটি গৃহীত উত্তরের চেয়ে আরও বেশি ধরণের পাওয়ারশেল কমান্ডের সাথে কাজ করে। উদাহরণস্বরূপ, আমার oktaএকটি উলামের নাম আছে okta.ps1যা পাওয়ারশেল স্ক্রিপ্টের দিকে নির্দেশ করে যা আমার নেই $PATH। গৃহীত উত্তরটি ব্যবহার করে স্ক্রিপ্টের নাম ফিরে আসে ( okta -> okta.ps1)। এটি ঠিক আছে তবে এটির অবস্থান আমাকে বলে না okta.ps1। এই উত্তরটি ব্যবহার করা আমাকে পুরো পথটি দেয় ( C:\Users\blah\etc\scripts\okta.ps1)। সুতরাং আমার কাছ থেকে +1
স্কাই --- অধিনায়ক

87

আমি সাধারণত টাইপ করি:

gcm notepad

অথবা

gcm note*

জিএমসি হ'ল গেট-কমান্ডের ডিফল্ট উপন্যাস।

আমার সিস্টেমে, জিসিএম নোট * আউটপুট:

[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
আমি যখন আমার পাওয়ারশেল কমান্ড প্রম্পটে "জিসিএম নোটপ্যাড" টাইপ করি তখন আমি কেবল প্রথম দুটি কলাম এবং তৃতীয় কলাম 'মডিউলনেম' পাই যা খালি। আপনি কীভাবে এটি ডিফল্টরূপে 'সংজ্ঞা' কলামটি তালিকাবদ্ধ করতে বাধ্য করবেন তা জানেন?
পীযূষ সোনি

3
@ পিয়ুশসনি এটি সম্ভবত পাওয়ারশেলের আপডেট হওয়া সংস্করণের কারণে। আপনি সর্বদা এমন কিছু করে অন্যান্য কলামগুলি প্রদর্শন করতে পারেন gcm note* | select CommandType, Name, Definition। আপনি যদি প্রায়শই এটি চালান তবে আপনার সম্ভবত এটি কোনও ফাংশনে আবৃত করা উচিত।
ডেভিড মোহুন্দ্রো

40

এই উদাহরণটি ব্যবহার করে দেখুন:

(Get-Command notepad.exe).Path

2
দয়া করে আরও কোড বা ব্যাখ্যা যুক্ত করুন যাতে ওপি আপনাকে আরও ভালভাবে বুঝতে পারে। ধন্যবাদ.
sshashank124

3
কম কোড যুক্ত করার জন্য আপনাকে ধন্যবাদ তাই আমি আসলে এটি একবারের জন্য মনে করতে পারি: পি
আলবার্টজান

1
এটাই আমি চেয়েছিলাম! এটি জিসিএমের সাথেও কাজ করে:(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

তবে এটি আসলে "যা" তা যেহেতু এটি কোনও ফাইল (টাইপ) নিয়ে কাজ করে এবং সেমিডলেট, ফাংশন বা উপকরণগুলি খুঁজে পায় না
জয়কুল

3

এই পাওয়ারশেলটি যা যাচাই করুন ।

সেখানে প্রদত্ত কোডটি এর পরামর্শ দেয়:

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

2
আমি জানি এটি বছর পেরিয়ে গেছে, তবে আমার পথে "% systemroot% \ system32 \ ..." ছিল এবং পাওয়ারশেল সেই পরিবেশের পরিবর্তনশীলকে প্রসারিত করে না এবং এটি করে ত্রুটি ছুঁড়ে ফেলে।
টেসেল্ল্যাটিংহেকলার

3

আমি পছন্দ করি Get-Command | Format-Listবা সংক্ষিপ্ততর, দুটির জন্য উপকরণ ব্যবহার করি এবং কেবল এর জন্য powershell.exe:

gcm powershell | fl

আপনি এর মতো উপাত্ত খুঁজে পেতে পারেন:

alias -definition Format-List

ট্যাব সমাপ্তি কাজ করে gcm


2

চেষ্টা কর whereউইন্ডোজ 2003 বা তারপরে (বা উইন্ডোজ 2000 / এক্সপি আপনি যদি রিসোর্স কিট ইনস্টল করেছেন) কমান্ডটি ব্যবহার করে ।

বিটিডাব্লু, এটি অন্যান্য প্রশ্নের আরও উত্তর পেয়েছে:

উইন্ডোজে 'কোন' এর সমতুল্য আছে?

ইউনিক্স whichকমান্ডের সমান পাওয়ারশেল ?


4
whereপাওয়ারশেল-এর Where-Objectকমান্ডলেটের উপাধি , সুতরাং where <item>পাওয়ারশেল প্রম্পটে টাইপ করলে কিছুই পাওয়া যায় না। এই উত্তরটি সম্পূর্ণরূপে ভুল - প্রথম সংযুক্ত প্রশ্নে গৃহীত উত্তরে যেমন উল্লেখ করা হয়েছে, ডস পাওয়ার জন্য whereআপনাকে টাইপ করতে হবে where.exe <item>
ইয়ান কেম্প

0

whichআমার পাওয়ারশেল প্রোফাইলে আমার এই উন্নত ফাংশন রয়েছে:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.