পাওয়ারশেলের সমতুল্য বাশের প্রক্রিয়া বিকল্পের সমতুল্য


14

<(..)প্রক্রিয়া বিকল্পের জন্য বাশ রয়েছে । পাওয়ারশেলের সমতুল্য কী?

আমি জানি যে আছে $(...), তবে এটি একটি স্ট্রিং দেয়, যখন <(..)একটি ফাইল ফেরত দেয় যখন বাইরের কমান্ডটি পড়তে পারে, যা এটি প্রত্যাশা করে।

আমি পাইপ ভিত্তিক সমাধানও খুঁজছি না, তবে আমি কমান্ড লাইনের মাঝখানে আটকে রাখতে পারি।


3
আফাইক এমন কোনও জিনিস নেই তবে এটি ভুল প্রমাণিত হওয়া আকর্ষণীয় হবে।
জোরডাচি

4
আপনি কীভাবে এটি ব্যবহারের আশা করবেন তার একটি মক-আপ উদাহরণ দিতে পারেন? আমি ভাবছি যে যদি ... (... | নির্বাচন করুন-এক্সপেন্ডপ্রোপার্টি অবজেক্টিউভান্টটোপাস) কোনও একক প্রতিস্থাপনের মামলা করতে পারে তবে।
অ্যান্ডি

2
পাওয়ারশেলে $ () হ'ল সুব্র্যাপশন অপারেটর, আপনি এটি এটি ব্যবহার করতে পারেন: Write-Output "The BITS service is $(Get-Service bits | select -ExpandProperty Stauts)"বিআইটিএস পরিষেবার স্থিতি পাওয়ার জন্য প্রথমে কোনও ভেরিয়েবলের মধ্যে লোড না করে। প্রক্রিয়া সাবস্টিটিউশনের দিকে
তাকানো

@ অ্যান্ডি: বৈশিষ্ট্যটি বাইরের ইউটিলিটিগুলিতে সহায়তা করবে যাতে ফাইলের নাম অপারেশন প্রয়োজন । একটি উদাহরণ psftp.exeএসএফটিপি স্থানান্তরের জন্য: এর -bবিকল্পটির জন্য আপনাকে কোনও ফাইলের মাধ্যমে সার্ভারে চালনার জন্য কমান্ড সরবরাহ করতে হবে , যা অসুবিধাগ্রস্থ, যদি আপনি কেবল চালনা করতে চান তবে বলুন mget *। পাওয়ারশেলের যদি প্রক্রিয়া প্রতিস্থাপন থাকে, আপনি এমন কিছু করতে সক্ষম হবেন psftp.exe -l user -p password somehost -b <( "mget *" )
এমকিলেমেন্ট

উত্তর:


4

এই উত্তরটি আপনার পক্ষে নয় , যদি আপনি:
- খুব কমই, যদি কখনও বাহ্যিক সিএলআই ব্যবহার করা প্রয়োজন (যা সাধারণত চালানোর জন্য মূল্যবান - পাওয়ারশেল-নেটিভ কমান্ডগুলি একসাথে আরও ভাল খেলে এবং এ জাতীয় বৈশিষ্ট্যের কোনও প্রয়োজন নেই)।
- বাশের প্রক্রিয়া বিকল্পের সাথে পরিচিত নয়।
এই উত্তরটি আপনার পক্ষে , যদি আপনি:
- ঘন ঘন বহিরাগত সিএলআই ব্যবহার করুন (অভ্যাসের বাইরে বা (ভাল) পাওয়ারশেল-নেটিভ বিকল্পগুলির অভাবের কারণে), বিশেষত স্ক্রিপ্টগুলি লেখার সময়।
- বাশের প্রক্রিয়া প্রতিস্থাপন কী করতে পারে তা ব্যবহার এবং প্রশংসা করা হয়।
- আপডেট : এখন যে ইউনিক্স প্ল্যাটফর্মগুলিতেও পাওয়ারশেল সমর্থিত, এই বৈশিষ্ট্যটি আরও আগ্রহী - গিটহাবে এই বৈশিষ্ট্যটির অনুরোধটি দেখুন, যা পরামর্শ দেয় যে পাওয়ারশেল প্রতিস্থাপন প্রক্রিয়া করার মতো একটি বৈশিষ্ট্য প্রয়োগ করে।

ইউনিক্স বিশ্বে, বাশ / কেএসএ / জেডএসে, একটি প্রক্রিয়া প্রতিস্থাপনটি কমান্ড আউটপুটকে চিকিত্সা করার প্রস্তাব দেয় যেন এটি একটি অস্থায়ী ফাইল যা নিজের পরে পরিষ্কার হয়ে যায়; উদাহরণস্বরূপ cat <(echo 'hello'), যেখানে কমান্ড catথেকে আউটপুট কমান্ড আউটপুট ধারণকারী অস্থায়ী ফাইলের পথecho হিসাবে দেখায় ।

যদিও পাওয়ারশেল-নেটিভ কমান্ডগুলির এমন বৈশিষ্ট্যের কোনও সত্য প্রয়োজন নেই, বাহ্যিক সি এল এল-এর সাথে কাজ করার সময় এটি কার্যকর হতে পারে ।

পাওয়ারশেলের বৈশিষ্ট্যটি অনুকরণ করা জটিল , তবে এটি আপনার পক্ষে মূল্যবান হতে পারে যদি আপনি নিজেকে প্রায়শই এটির প্রয়োজন মনে করেন।

cfস্ক্রিপ্ট ব্লক গ্রহন করে, ব্লকটি কার্যকর করে এবং তার আউটপুট কোনও টেম্পে লিখে দেয় এমন একটি ফাংশন চিত্রযুক্ত করুন। চাহিদার ভিত্তিতে ফাইল তৈরি হয়েছে এবং অস্থিরতা ফিরিয়ে দেয়। ফাইলের পথ ; উদাহরণ:

 findstr.exe "Windows" (cf { Get-ChildItem c:\ }) # findstr sees the temp. file's path.

এটি একটি সাধারণ উদাহরণ যা এই জাতীয় বৈশিষ্ট্যের প্রয়োজনের চিত্রিত করে না doesn't psftp.exeএসএফটিপি স্থানান্তরগুলির জন্য সম্ভবত আরও দৃ conv়প্রবণ দৃশ্যের ব্যবহার : এর ব্যাচ (স্বয়ংক্রিয়) ব্যবহারের জন্য পছন্দসই কমান্ডগুলি অন্তর্ভুক্ত একটি ইনপুট ফাইল সরবরাহ করা প্রয়োজন , যেখানে এই জাতীয় কমান্ডগুলি সহজেই ফ্লাইয়ের স্ট্রিং হিসাবে তৈরি করা যায়।

যতটা সম্ভব বাহ্যিক ইউটিলিটিগুলির সাথে যথাসম্ভব ব্যাপকভাবে সামঞ্জস্য করা যায়, অস্থায়ী। ডিফল্টরূপে কোনও বিওএম (বাইট-অর্ডার চিহ্ন) ছাড়াই ফাইলটি ইউটিএফ -8 এনকোডিং ব্যবহার করা উচিত , যদিও আপনি প্রয়োজনের সাথে কোনও ইউটিএফ -8 বিওএম-র অনুরোধ করতে পারেন ।-BOM

দুর্ভাগ্যক্রমে, প্রক্রিয়া বিকল্পগুলির স্বয়ংক্রিয় ক্লিনআপ দিকটি সরাসরি অনুকরণ করা যায় না, সুতরাং একটি পরিষ্কার ক্লিনআপ কল প্রয়োজন ; cf তর্ক ছাড়াই কল করে পরিষ্কার করা হয় :

  • জন্য ইন্টারেক্টিভ ব্যবহার করেন, আপনি করতে পারেন আপনার টু পরিষ্করণ কল যোগ করে পরিষ্করণ স্বয়ংক্রিয় promptনিম্নরূপ (ফাংশন promptফাংশন প্রম্পট ফেরৎ স্ট্রিং , কিন্তু পর্দার পেছনের সম্পাদন করতে ব্যবহার করা যেতে পারে প্রত্যেক সময় প্রম্পট প্রদর্শিত হয়, ব্যাশ এর অনুরূপ কমান্ড $PROMPT_COMMANDপরিবর্তনশীল); যে কোনও ইন্টারেক্টিভ সেশনে উপলব্ধতার জন্য, cfআপনার পাওয়ারশেল প্রোফাইলে নীচের সংজ্ঞাটি যুক্ত করুন :

    "function prompt { cf 4>`$null; $((get-item function:prompt).definition) }" |
      Invoke-Expression
  • স্ক্রিপ্টগুলিতে ব্যবহারের জন্য, ক্লিনআপ সম্পন্ন হয়েছে তা নিশ্চিত করার জন্য, যে ব্লকটি ব্যবহার করে cf- সম্ভাব্যভাবে পুরো স্ক্রিপ্টটি একটি try/ finallyব্লকে আবৃত করা দরকার , যেখানে cfআর্গুমেন্ট ছাড়াই ক্লিনআপের জন্য ডাকা হয়:

# Example
try {

  # Pass the output from `Get-ChildItem` via a temporary file.
  findstr.exe "Windows" (cf { Get-ChildItem c:\ })

  # cf() will reuse the existing temp. file for additional invocations.
  # Invoking it without parameters will delete the temp. file.

} finally {
  cf  # Clean up the temp. file.
}

এখানে বাস্তবায়ন উন্নত ফাংশন: ConvertTo-TempFileএবং তার সংক্ষিপ্ত ওরফে, cf:

দ্রষ্টব্য : গতিশীল মডিউলেরNew-Module মাধ্যমে ফাংশনটি সংজ্ঞায়িত করার জন্য PSv3 + এর ব্যবহারের ব্যবহারটি নিশ্চিত করে যে স্ক্রিপ্ট ব্লক পাসের মধ্যে উল্লেখ করা ফাংশন পরামিতি এবং ভেরিয়েবলের মধ্যে কোনও পরিবর্তনশীল দ্বন্দ্ব থাকতে পারে না।

$null = New-Module {  # Load as dynamic module
  # Define a succinct alias.
  set-alias cf ConvertTo-TempFile
  function ConvertTo-TempFile {
    [CmdletBinding(DefaultParameterSetName='Cleanup')]
    param(
        [Parameter(ParameterSetName='Standard', Mandatory=$true, Position=0)]
        [ScriptBlock] $ScriptBlock
      , [Parameter(ParameterSetName='Standard', Position=1)]
        [string] $LiteralPath
      , [Parameter(ParameterSetName='Standard')]
        [string] $Extension
      , [Parameter(ParameterSetName='Standard')]
        [switch] $BOM
    )

    $prevFilePath = Test-Path variable:__cttfFilePath
    if ($PSCmdlet.ParameterSetName -eq 'Cleanup') {
      if ($prevFilePath) { 
        Write-Verbose "Removing temp. file: $__cttfFilePath"
        Remove-Item -ErrorAction SilentlyContinue $__cttfFilePath
        Remove-Variable -Scope Script  __cttfFilePath
      } else {
        Write-Verbose "Nothing to clean up."
      }
    } else { # script block specified
      if ($Extension -and $Extension -notlike '.*') { $Extension = ".$Extension" }
      if ($LiteralPath) {
        # Since we'll be using a .NET framework classes directly, 
        # we must sync .NET's notion of the current dir. with PowerShell's.
        [Environment]::CurrentDirectory = $pwd
        if ([System.IO.Directory]::Exists($LiteralPath)) { 
          $script:__cttfFilePath = [IO.Path]::Combine($LiteralPath, [IO.Path]::GetRandomFileName() + $Extension)
          Write-Verbose "Creating file with random name in specified folder: '$__cttfFilePath'."
        } else { # presumptive path to a *file* specified
          if (-not [System.IO.Directory]::Exists((Split-Path $LiteralPath))) {
            Throw "Output folder '$(Split-Path $LiteralPath)' must exist."
          }
          $script:__cttfFilePath = $LiteralPath
          Write-Verbose "Using explicitly specified file path: '$__cttfFilePath'."
        }
      } else { # Create temp. file in the user's temporary folder.
        if (-not $prevFilePath) { 
          if ($Extension) {
            $script:__cttfFilePath = [IO.Path]::Combine([IO.Path]::GetTempPath(), [IO.Path]::GetRandomFileName() + $Extension)
          } else {
            $script:__cttfFilePath = [IO.Path]::GetTempFilename() 
          }
          Write-Verbose "Creating temp. file: $__cttfFilePath"
        } else {
          Write-Verbose "Reusing temp. file: $__cttfFilePath"      
        }
      }
      if (-not $BOM) { # UTF8 file *without* BOM
        # Note: Out-File, sadly, doesn't support creating UTF8-encoded files 
        #       *without a BOM*, so we must use the .NET framework.
        #       [IO.StreamWriter] by default writes UTF-8 files without a BOM.
        $sw = New-Object IO.StreamWriter $__cttfFilePath
        try {
            . $ScriptBlock | Out-String -Stream | % { $sw.WriteLine($_) }
        } finally { $sw.Close() }
      } else { # UTF8 file *with* BOM
        . $ScriptBlock | Out-File -Encoding utf8 $__cttfFilePath
      }
      return $__cttfFilePath
    }
  }
}

Outputচ্ছিকভাবে একটি আউটপুট [ফাইল] পাথ এবং / অথবা ফাইল নাম এক্সটেনশন নির্দিষ্ট করার ক্ষমতা নোট করুন।


আপনার এই কাজটি করার দরকারটি যে ধারণাটি সর্বোত্তমভাবে সন্দেহজনক এবং কেবল পাওয়ারশেল ব্যবহার না করার জন্য বিষয়টিকে আরও সহজ করে তুলবে।
জিম বি

1
@ জিমবি: আমি ব্যক্তিগতভাবে এটি ব্যবহার করি psftp.exe, যা আমাকে এটি লিখতে প্ররোচিত করেছিল। যদিও পাওয়ারশেলে স্থানীয়ভাবে সবকিছু করা ভাল, এটি সর্বদা সম্ভব নয়; পাওয়ারশেল থেকে বাহ্যিক সিএলআইগুলিকে অনুরোধ করা এবং তা অবিরত থাকবে; আপনি যদি নিজেকে বার বার সিআইএলগুলি সাথে ডিল করতে দেখেন যা ফাইল ইনপুট প্রয়োজন যা আরও বেশি সহজে মেমরিতে / অন্য কমান্ড দ্বারা তৈরি করা যায় তবে এই উত্তরের ক্রিয়াটি আপনার জীবনকে আরও সহজ করে তুলতে পারে।
এমকিলেমেন্ট

তুমি কি মজা করছ? এর কোনটিরই দরকার নেই। আমি এখনও একটি কমান্ড খুঁজে পাইনি যা পরামিতিগুলির জন্য কমান্ডগুলি সহ কেবল ফাইলগুলি গ্রহণ করে। যতদূর এসএফটিপি যায় সরল অনুসন্ধান আমাকে 2 টি সাধারণ অ্যাডিন অ্যাসেমব্লিগুলি পাওয়ারশেলের এফটিপি করার জন্য দেখায়।
জিম বি

1
@ জিমবি: আপনি যদি এই কথোপকথনটি গঠনমূলক পদ্ধতিতে চালিয়ে যেতে চান তবে আপনার স্বর পরিবর্তন করুন।
এমকিলেমেন্ট

2
আপনি আগ্রহী হলে @ জিমবি জিএনইউ ডিফিউটিসগুলি কেবলমাত্র ফাইলগুলিতে কাজ করে।
পাভেল

2

ডাবল উদ্ধৃতিতে আবদ্ধ না হলে, $(...)প্রথমে সংযুক্ত কোডটি মূল্যায়ন করে একটি পাওয়ারশেল অবজেক্ট (বা বরং, কোড দ্বারা বর্ধিত যা কিছু আসে) ফেরত দেয়। এটি আপনার উদ্দেশ্যগুলির জন্য উপযুক্ত হতে হবে ("কিছু কিছু [আমি] কমান্ড লাইনের মাঝখানে আটকে রাখতে পারে"), ধরে নিই যে কমান্ড-লাইনটি পাওয়ারশেল।

আপনি বিভিন্ন সংস্করণে পাইপ দিয়ে Get-Memberবা এটি সরাসরি সরাসরি আউটপুট করেও এটি পরীক্ষা করতে পারেন ।

PS> "$(ls C:\Temp\Files)"
new1.txt new2.txt

PS> $(ls C:\Temp\Files)


    Directory: C:\Temp\Files


Mode                LastWriteTime         Length Name                                                                      
----                -------------         ------ ----                                                                      
-a----       02/06/2015     14:58              0 new1.txt                                                                  
-a----       02/06/2015     14:58              0 new2.txt   

PS> "$(ls C:\Temp\Files)" | gm


   TypeName: System.String
<# snip #>

PS> $(ls C:\Temp\Files) | gm


   TypeName: System.IO.FileInfo
<# snip #>

ডাবল উদ্ধৃতিতে যখন আবদ্ধ থাকে, আপনি যেমন লক্ষ্য করেছেন, `" $ (...) "কেবল একটি স্ট্রিং ফিরিয়ে দেবে।

এইভাবে, যদি আপনি কোনও লাইনটিতে কোনও ফাইলের বিষয়বস্তু সন্নিবেশ করতে, বলতে চান তবে আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

Invoke-Command -ComputerName (Get-Content C:\Temp\Files\new1.txt) -ScriptBlock {<# something #>}

এটি একটি দুর্দান্ত উত্তর !!
গ্রেগএল

আপনি যা বর্ণনা করছেন তা বাশের প্রক্রিয়া বিকল্পের সমতুল্য নয় । প্রক্রিয়া প্রতিস্থাপনটি ফাইলের নাম অপারেন্ডগুলির প্রয়োজন হয় এমন কমান্ডগুলির সাথে ব্যবহারের জন্য ডিজাইন করা হয়েছে ; অর্থাত, একটি প্রক্রিয়া প্রতিস্থাপনে আবদ্ধ একটি কমান্ড থেকে আউটপুট হ'ল আলগাভাবে বলা হয়, একটি অস্থায়ী ফাইলে লেখা হয় এবং সেই ফাইলটির পথ ফিরে আসে; অতিরিক্তভাবে, ফাইলটির অস্তিত্ব হ'ল কমান্ডটি ফাঁকা হয় যে প্রক্রিয়া প্রতিস্থাপনের একটি অংশ। পাওয়ারশেলের যদি এমন বৈশিষ্ট্য থাকে তবে আপনি নীচের মতো কিছু কাজ করার আশা করতেন:Get-Content <(Get-ChildItem)
এমকিলেমেন্ট

আমি ভুল হলে দয়া করে আমাকে সংশোধন করুন, এবং এটি আপনি যা খুঁজছেন তা নয়, তবে Get-ChildItem | Get-Contentপুরোপুরি ভালভাবে কাজ করে না ? অথবা আপনি অন্যথায় Get-Content (Get-ChildItem).FullNameএকই প্রভাব জন্য চেষ্টা করতে পারেন ? আপনি অন্য স্ক্রিপ্টিং পদ্ধতির দ্বারা পুঙ্খানুপুঙ্খভাবে প্রভাবিত এমন দর্শন থেকে এটি পৌঁছাতে পারেন।
জেমস রুস্কিন

1
হ্যাঁ, পাওয়ারশেলের রাজ্যে এই বৈশিষ্ট্যের প্রয়োজন নেই; এটি শুধুমাত্র সাথে ব্যবহারের জন্য আগ্রহের বিষয় বহিরাগত CLIs যে প্রয়োজন ফাইল ইনপুট, এবং যেখানে এই ধরণের ফাইলগুলিকে বিষয়বস্তুর সহজেই একটি (PowerShell) কমান্ড দিয়ে নির্মিত হয়। একটি বাস্তব-বিশ্বের উদাহরণের জন্য প্রশ্নে আমার মন্তব্য দেখুন। আপনার কখনই এ জাতীয় বৈশিষ্ট্যটির প্রয়োজন হতে পারে না, তবে যাদের ঘন ঘন বাহ্যিক সিএলআই কল করা প্রয়োজন তাদের পক্ষে এটি আগ্রহী। কমপক্ষে আপনার উত্তরটি উপস্থাপন করা উচিত যে আপনি পাওয়ার শেল জিনিসগুলি করার পদ্ধতি প্রদর্শন করছেন - যেমনটি ওপি বিশেষত যা চেয়েছিল তার বিপরীতে - এবং আপনি কেন করছেন।
এমকিলেমেন্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.