powershell - আমি কীভাবে কমান্ড লাইনে বিভিন্ন মানের মান পাস করব-একটি আর্গুমেন্ট হিসাবে একটি অভিব্যক্তিটি পাস করছি



parsing command-line (1)

আমার কাছে নিম্নলিখিত কোড রয়েছে:

$srv_range = 29..30+40+50..52
$srv_range.GetType()
$NewVMTemplate = New-Object psobject
$NewVMTemplate | Add-Member -MemberType NoteProperty -Name Name -Value $null

$srv_range | % {
    $pod= $_
    $servers = @()
    1..2 | % {
        $server = $NewVMTemplate | Select-Object *
        $server.Name = "pod" + "{0:D2}" -f $pod + "-srv" + $_
        $servers += $server
    }
    ForEach ( $server in $servers) {
        write-host $server.Name
    }
} 

আউটপুট:

PowerCLI C:\ .\eraseme.ps1

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
pod29-srv1
pod29-srv2
pod30-srv1
pod30-srv2
pod40-srv1
pod40-srv2
pod50-srv1
pod50-srv2
pod51-srv1
pod51-srv2
pod52-srv1
pod52-srv2

আমি সিএলআই থেকে রেঞ্জটি ইনপুট করতে চাই, তবে আমি এই কোডটি সহ নিম্নলিখিত ফলাফলটি পাই

param(

    [Parameter(Mandatory=$False)] $srv_range

)
#$srv_range = 29..30+40+50..52
$srv_range.GetType()
$NewVMTemplate = New-Object psobject
$NewVMTemplate | Add-Member -MemberType NoteProperty -Name Name -Value $null

$srv_range | % {
    $pod= $_
    $servers = @()
    1..2 | % {
        $server = $NewVMTemplate | Select-Object *
        $server.Name = "pod" + "{0:D2}" -f $pod + "-srv" + $_
        $servers += $server
    }
    ForEach ( $server in $servers) {
        write-host $server.Name
    }
} 

PowerCLI C:\ .\eraseme.ps1 29..30+40+50..52

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object
pod29..30+40+50..52-srv1
pod29..30+40+50..52-srv2

আমি কীভাবে সিএমএল থেকে রেঞ্জটি ইনপুট করতে পারি এবং প্রথম কোডের মতো একই ফলাফল পেতে পারি?


আপনার সমস্যাটি হ'ল আর্গুমেন্ট 29..30+40+50..52 আপনার স্ট্রিংকে আক্ষরিক হিসাবে বিবেচনা করা হয় .\eraseme.ps1 29..30+40+50..52 কল - এটি একটি অভিব্যক্তি হিসাবে স্বীকৃত নয়

একটি অভিব্যক্তি হিসাবে স্বীকৃতি জোর করতে , কেবল (...) এ যুক্তিটি বন্ধ করুন :

.\eraseme.ps1 (29..30+40+50..52)

মনে রাখবেন যে আপনি আরও নির্দিষ্ট ধরণের সাথে আপনার পরামিতিটি ঘোষণা করে আপনার স্ক্রিপ্টটিকে আরও শক্তিশালী করতে পারেন, সেক্ষেত্রে স্ট্রিং দিয়ে এটিকে কল করার চেষ্টা এখনই ব্যর্থ হয়ে যাবে:

 [Parameter(Mandatory=$False)] [int[]] $srv_range

(অন্যান্য অপ্টিমাইজেশানগুলি আপনার স্ক্রিপ্টেও প্রয়োগ করা যেতে পারে))

Backgroundচ্ছিক পটভূমি তথ্য

যেমন যখন অব্যক্ত টোকেনটিকে আর্গুমেন্ট মোডে একটি ( about_Parsing ) স্ট্রিং হিসাবে একটি এক্সপ্রেশন হিসাবে বিবেচনা করা হবে ( about_Parsing ):

  • (...) , $(...) , এবং @(...) দ্বারা বা একটি টোকেনের শুরুতে একটি নতুন পার্সিং প্রসঙ্গ তৈরি করে , যাতে অভিব্যক্তি বা এমনকি নেস্টেড কমান্ড ব্যবহার করা যেতে পারে:

    • (...) একক অভিব্যক্তি বা আদেশের জন্য যথেষ্ট। $(...) ( স্যুবপ্রেসার অপারেটর ) একাধিক এক্সপ্রেশন / কমান্ড বন্ধ করতে পারে; সুতরাং @() ( অ্যারে subexpression অপারেটর) করতে পারেন এবং এটি অতিরিক্তভাবে নিশ্চিত করে যে এর আউটপুট সর্বদা অ্যারে হিসাবে বিবেচিত হবে।

    • উল্লেখযোগ্যভাবে, উপরের কোনও একটিতে আবদ্ধ না হয়ে নিম্নলিখিত এক্সপ্রেশনগুলি স্বীকৃত নয় :

      • [...] (আক্ষরিক টাইপ করুন) এবং তাদের সদস্যদের অ্যাক্সেস যেমন: [Environment]::Version
      • .. (পরিসীমা এক্সপ্রেশন) যেমন 1..10
    • যদি, একটি টোকেনের শুরুতে , (...) , $(...) , বা @(...) অতিরিক্ত অক্ষর অনুসরণ করে, তবে প্রথম অতিরিক্ত অক্ষরটিকে একটি নতুন, পৃথক যুক্তির সূচনা হিসাবে বিবেচনা করা হবে।

    • বিপরীতে, যদি এগুলির পূর্বে কোনও অব্যক্ত আক্ষরিক বা কেবল একটি পরিবর্তনশীল-কেবল রেফারেন্স থাকে তবে $(...) "..." (একটি প্রসারণযোগ্য স্ট্রিং) এর অভ্যন্তরের মতো কাজ করে, (...) একটি নতুন যুক্তি শুরু করে যা একটি এক্সপ্রেশন এবং @(...) (...) আবার (...) দিয়ে আক্ষরিক হিসাবে নেওয়া হয় আবার নতুন যুক্তি শুরু করে যা একটি অভিব্যক্তি।
  • একটি @ অনুসরণ করে একটি ভেরিয়েবলের নাম (উদাহরণস্বরূপ, @params ) রয়েছে বা প্যারামিটার মানগুলির হ্যাশটেবল রয়েছে যা প্যারামিটার স্প্ল্যাটিং শুরু করে।

  • @{ ... } হ্যাশটেবল আক্ষরিক (যেমন, @{ key = 'value' } ) পাস করতে ব্যবহার করা যেতে পারে।

  • { ... } a একটি স্ক্রিপ্ট ব্লক তৈরি করে ( [scriptblock] স্ক্রিপ্টব্লক [scriptblock] )।

  • তাদের দ্বারা বা একটি টোকেনের শুরুতে , সদস্য অ্যাক্সেস (সম্পত্তি অ্যাক্সেস, পদ্ধতি কল, সূচীকরণ) সহ ভেরিয়েবল রেফারেন্সগুলি হ'ল হিসাবে ব্যবহার করা যেতে পারে :

    • $HOME , $PSVersionTable.PSVersion , $someArray[0] , এবং $someString.ToUpper() এর মতো এক্সপ্রেশনগুলি স্বীকৃত, এবং তাদের সহজাত প্রকার হিসাবে ফিরে এসেছে।

    • সদস্য অ্যাক্সেস ব্যতীত , যেমন vari হোমের মতো একটি সাধারণ পরিবর্তনশীল রেফারেন্স সহ, পরবর্তী অক্ষরগুলি (সম্ভাব্য) একই যুক্তির অংশ হিসাবে বিবেচিত হয় যা পরে প্রসারিত স্ট্রিং হিসাবে ব্যাখ্যা করা হয় - নীচে দেখুন।

    • সদস্য অ্যাক্সেসের সাথে, কোনও অতিরিক্ত অক্ষরের প্রথমটিকে একটি নতুন যুক্তির সূচনা হিসাবে বিবেচনা করা হয় (উদাহরণস্বরূপ, $foo.Length-more দুটি আর্গুমেন্টে ফলাফল: $foo.Length এবং স্ট্রিং আক্ষরিক- -more ) $foo.Length

  • সমস্ত কিছুকে একটি প্রসারণযোগ্য স্ট্রিং হিসাবে বিবেচনা করা হয় , যেমন, ডাবল- কোটড স্ট্রিংয়ের সামগ্রীর অনুরূপ , মেটাচার্যাক্টর [1] ব্যতীত এখনও অব্যাহতি প্রয়োজন এবং নির্দিষ্ট টোকেনগুলি একাধিক যুক্তি হিসাবে ব্যাখ্যা করা হয়

    • প্রসারণযোগ্য অর্থ এম্বেড করা সহজ ভেরিয়েবল রেফারেন্সগুলি (যেমন, OME $HOME\Desktop বা v এনভ: অ্যাপডিটা ATA $env:APPDATA\Test ) ইন্টারপোলটেড হয় (তাদের স্ট্রিংযুক্ত মানগুলির সাথে প্রতিস্থাপিত হয়)।
      নোট করুন যে এর ফলে এমন একটি উপস্থাপনা হতে পারে যা কনসোল-এ দেখানো হিসাবে প্রদত্ত মানের ডিফল্ট আউটপুট ফর্ম্যাট থেকে পৃথক হয় (উদাহরণস্বরূপ, আরও তথ্যের জন্য এই উত্তরটি দেখুন)।

      • পরবর্তী অক্ষরগুলি থেকে এটি বিতরণ করতে lo {...} in এ একটি চলক নাম যুক্ত করুন, যেমন প্রয়োজন হয় (যেমন, ${HOME} )।
    • একটি ভেরিয়েবল মানটির সম্পত্তি অ্যাক্সেস করতে বা একটি সূচক ব্যবহার করতে বা কোনও পদ্ধতিতে কল করতে বা স্বেচ্ছাসৈনিক কমান্ডগুলি এম্বেড করতে আপনাকে অবশ্যই এক্সপ্রেশনটি, $(...) , যেমন, v$($PSVersionTable.PSVersion)

    • "..." এ এমবেডেড ভেরিয়েবল রেফারেন্স / এক্সপ্রেশন সহ টোকেনগুলি সংযুক্ত করা সবচেয়ে নিরাপদ কারণ এটি নিম্নলিখিত প্রান্তের মামলাগুলি এড়িয়ে চলে:

      • qu $(...) অব্যর্থ টোকেনের প্রারম্ভে প্রসারণযোগ্য স্ট্রিংয়ের অংশ হিসাবে ব্যাখ্যা করা হয় না , এটি একটি পৃথক যুক্তি হিসাবে বিবেচনা করা হয় (উদাহরণস্বরূপ, Write-Output $('ab')c ফলাফল দুটি যুক্তিযুক্ত: ফলাফল $('ab') এবং আক্ষরিক c )।
      • . টোকেনের শুরুতে তত্ক্ষণাত্ একটি সাধারণ পরিবর্তনশীল রেফারেন্স বা সুব এক্সপ্রেসনের পরে পৃথক যুক্তিগুলির ফলাফল হয়
        (উদা .$HOME দুটি ফলাফলের জন্য আক্ষরিক: আক্ষরিক . , এবং $HOME মান) এর ফলাফল দেয়)
    • দ্রষ্টব্য: যদিও প্রসারণের ফলাফলটি একটি স্ট্রিং, এটি অগত্যা একটাই থেকে যায় না: চূড়ান্ত প্রকারটি হস্ত কমান্ডের প্যারামিটারের ধরণের দ্বারা নির্ধারিত হয় যার বর্ধিত মান সীমাবদ্ধ।

    • অবতরণ / উদ্ধৃতি:

      • পাওয়ারশেলের সেন্টিমিডি.এক্স.এর চেয়ে অনেকগুলি মেটাচার্যাক্টর রয়েছে এবং একটি উল্লেখযোগ্য ক্ষতি হ'ল আক্ষরিক আচরণের জন্য তাকে পালাতে হবে, কারণ , পাওয়ারশেলের আরে-নির্মাণ অপারেটর।

      • একটি একক অক্ষর থেকে বাঁচতে , এটি ` (ব্যাকটিক) দিয়ে উপসর্গ করুন।

      • পৃথকভাবে মেটাচ্যাকার্টারদের পালানোর প্রয়োজন এড়াতে , "..." (ডাবল উদ্ধৃতি) বা '...' (একক উদ্ধৃতি) এর মধ্যে মানটি বন্ধ করুন:

        • আপনি যদি স্ট্রিংটি ইন্টারপোলটেড (প্রসারিত) করতে চান তবে ডাবল উদ্ধৃতি ব্যবহার করুন , আপনি যদি ভেরিয়েবল রেফারেন্স এবং সুব এক্সপ্রেসন এম্বেড করতে সক্ষম হতে চান তবে।

          • একটি দ্বিগুণ-উদ্ধৃত স্ট্রিংয়ের অভ্যন্তরে, নিম্নলিখিত অক্ষরগুলি ছাড়ুন। আক্ষরিক হিসাবে তাদের আচরণ করা: ` " $
        • আক্ষরিক হিসাবে মান হিসাবে আচরণ করতে একক উদ্ধৃতি ব্যবহার করুন

          • একটি একক-উদ্ধৃত স্ট্রিংয়ের ভিতরে, ' হিসাবে '' এড়িয়ে চলুন
      • একক- বা ডাবল-উদ্ধৃতি হ'ল একটি মানের মধ্যে ফাঁকা স্থানগুলি রক্ষা করার সহজতম উপায়।

  • পরিশেষে, দ্রষ্টব্য --% , তথাকথিত স্টপ-পার্সিং প্রতীক (PSv3 +), সমস্ত অবশিষ্ট আর্গুমেন্টের ব্যাখ্যা সম্পূর্ণরূপে পরিবর্তন করে: লেগ্যাসি cmd.exe কমান্ড লাইনগুলির সাথে ব্যবহারের জন্য ডিজাইন করা, এটি ব্যতীত অন্যান্য রেখার ব্যাখ্যা ব্যাখ্যা বন্ধ করে দেয় cmd.exe স্টাইল %...% পরিবেশের ভেরিয়েবলের প্রসার Get-Help about_Parsing দেখুন

উদ্ধৃত টোকেন ব্যবহার করার জন্য:

  • '...' বা "..." দ্বারা বা একটি টোকেনের শুরুতে :

    • এগুলি যথারীতি পার্স করা হয়: আক্ষরিক ( '...' ) বা প্রসারিত ( "..." ) স্ট্রিং হিসাবে।
    • কোনও অতিরিক্ত অক্ষর প্রথম অতিরিক্ত অক্ষরটিকে নতুন, পৃথক যুক্তির সূচনা হিসাবে বিবেচনা করে cause
  • '...' বা "..." পূর্বে একটি অব্যক্ত আক্ষরিক বা কেবল পরিবর্তনশীল-কেবল উল্লেখ :

    • সেগুলি যথারীতি মূল্যায়ন করা হয় এবং ফলাফল (যেমন, উদ্ধৃতিগুলি সরানো সহ) তাদের পূর্ববর্তীগুলির সাথে সংযুক্ত করা হয় (মূল্যায়ন করা হয়)।

[1] আর্গুমেন্ট-মোড মেটাচার্যাক্টর (বিশেষ সিনট্যাকটিক অর্থ সহ অক্ষর) হ'ল :
<space> ' " ` , ; ( ) { } | & < > @ #
এর মধ্যে < > @ # টোকেনের শুরুতে বিশেষ।

উদাহরণ

Write-Output 1..10    # STRING: -> '1..10'
Write-Output (1..10)  # EXPRESSION: -> @(1, 2, ...)
# Write-Output $(1..10) would work too, but is only necessary if 
# the enclosed expression comprises *multiple* statements.

Write-Output [Environment]::Version  # STRING: -> '[Environment]::Ticks'
Write-Output ([Environment]::Version)  # EXPRESSION: -> a [System.Version] instance.

Write-Output a,b    # !! ARRAY @(1, 2), because "," is not escaped.
Write-Output a`,b   #`# STRING 'ab'                                 
Write-Output "a,b"  # ditto
Write-Output 'a,b'  # ditto

Write-Output $HOME\Desktop   # EXPANDED string (e.g.) 'C:\Users\jdoe\Desktop'
Write-Output "$HOME\Desktop" # ditto
Write-Output '$HOME\Desktop' # LITERAL string '$HOME\Desktop'
Write-Output dir=$HOME       # EXPANDED string (e.g.) 'dir=C:\Users\jdoe\Desktop'

Write-Output $PSVersionTable.PSVersion           # a [System.Version] instance
Write-Output "$($PSVersionTable.PSVersion)/more" # a [string]; e.g., '5.1.14393.576/more'
Write-Output "v$($PSVersionTable.PSVersion)"     # ditto; e.g., 'v5.1.14393.576'

# !!! These DO NOT WORK as intended.
Write-Output $($PSVersionTable.PSVersion)/more # $(...) at the *start*
Write-Output $PSVersionTable.PSVersion/more    # $(...) missing
Write-Output "$PSVersionTable.PSVersion/more"  # $(...) missing
Write-Output .$HOME # Specifically, .$ at the beginning is the problem; escaping . works




parameter-passing