পাওয়ারশেলের নাল কোলেসেসিং


115

পাওয়ারশেলে নাল কোলেসিং অপারেটর আছে কি?

আমি পাওয়ার সিলে এই সি # কমান্ডগুলি করতে সক্ষম হতে চাই:

var s = myval ?? "new value";
var x = myval == null ? "" : otherval;

উত্তর:


133

পাওয়ারশেল 7+

পাওয়ারশেল, পাওয়ারশেলের নেটিভ নাল কোয়েলসিং, নাল কন্ডিশনাল অ্যাসাইনমেন্ট এবং টেরিনারি অপারেটরগুলির সাথে পরিচয় করিয়ে দেয়

নাল কোলেসিং

$null ?? 100    # Result is 100

"Evaluated" ?? (Expensive-Operation "Not Evaluated")    # Right side here is not evaluated

নাল কন্ডিশনাল এসাইনমেন্ট

$x = $null
$x ??= 100    # $x is now 100
$x ??= 200    # $x remains 100

টার্নারি অপারেটর

$true  ? "this value returned" : "this expression not evaluated"
$false ? "this expression not evaluated" : "this value returned"

পূর্বের সংস্করণসমূহ:

পাওয়ারশেল সম্প্রদায় সম্প্রসারণের প্রয়োজন নেই, আপনি স্ট্যান্ডার্ড পাওয়ারশেল ব্যবহার করতে পারেন যদি বিবৃতি হিসাবে অভিব্যক্তি হিসাবে:

variable = if (condition) { expr1 } else { expr2 }

সুতরাং আপনার প্রথম সি # প্রকাশের প্রতিস্থাপনগুলিতে:

var s = myval ?? "new value";

নিম্নলিখিতগুলির মধ্যে একটি হয়ে যায় (পছন্দ অনুসারে):

$s = if ($myval -eq $null) { "new value" } else { $myval }
$s = if ($myval -ne $null) { $myval } else { "new value" }

বা কি নির্ভর করে - মাইভালটিতে আপনি কী ব্যবহার করতে পারেন তা থাকতে পারে:

$s = if ($myval) { $myval } else { "new value" }

এবং দ্বিতীয় সি # এক্সপ্রেশন মানচিত্রগুলি একইভাবে:

var x = myval == null ? "" : otherval;

হয়ে

$x = if ($myval -eq $null) { "" } else { $otherval }

এখন ন্যায়সঙ্গত হওয়ার জন্য, এগুলি খুব চটজলদি নয়, এবং সি # ফর্মগুলির মতো ব্যবহার করার মতো স্বাচ্ছন্দ্যময় আর কোথাও নেই।

জিনিসগুলি আরও পঠনযোগ্য করার জন্য আপনি এটি খুব সাধারণ কার্যক্রমে মোড়ানো বিবেচনা করতে পারেন:

function Coalesce($a, $b) { if ($a -ne $null) { $a } else { $b } }

$s = Coalesce $myval "new value"

বা সম্ভবত হিসাবে, ifNull:

function IfNull($a, $b, $c) { if ($a -eq $null) { $b } else { $c } }

$s = IfNull $myval "new value" $myval
$x = IfNull $myval "" $otherval

আপনি দেখতে পাচ্ছেন খুব সাধারণ একটি ফাংশন আপনাকে সিনট্যাক্সের স্বাধীনতা দিতে পারে।

আপডেট: মিশ্রণটি বিবেচনা করার জন্য একটি অতিরিক্ত বিকল্প হ'ল আরও জেনেরিক ইসট্রু ফাংশন:

function IfTrue($a, $b, $c) { if ($a) { $b } else { $c } }

$x = IfTrue ($myval -eq $null) "" $otherval

তারপরে অপারেটরগুলির মতো দেখতে কিছুটা ভিন্নরূপ ঘোষণার জন্য পাওয়ারশেলের ক্ষমতাটি একত্রিত করুন, আপনি এতে শেষ করবেন:

New-Alias "??" Coalesce

$s = ?? $myval "new value"

New-Alias "?:" IfTrue

$ans = ?: ($q -eq "meaning of life") 42 $otherval

স্পষ্টতই এটি প্রত্যেকের স্বাদ হতে পারে না, তবে আপনি যা খুঁজছেন তা হতে পারে।

থমাস নোট হিসাবে, সি # সংস্করণ এবং উপরোক্ত মধ্যে অন্য একটি সূক্ষ্ম পার্থক্য হ'ল সি # আর্গুমেন্টের সংক্ষিপ্ত-সঞ্চালন সম্পাদন করে, তবে ফাংশন / উপকরণের সাথে জড়িত পাওয়ারশেল সংস্করণ সবসময় সমস্ত যুক্তি মূল্যায়ন করবে। এটি যদি সমস্যা হয় তবে ifএক্সপ্রেশন ফর্মটি ব্যবহার করুন ।


6
Coalescing অপারেটরের একমাত্র সত্য সমতুল্য যদি একটি if স্টেটমেন্ট ব্যবহার করে; সমস্যাটি হ'ল অন্য যে কোনও পদ্ধতির দ্বারা সংক্ষিপ্ত-সার্কিটের পরিবর্তে সমস্ত অপারেন্ডকে মূল্যায়ন করে। "?? $ মাইভাল সামারলিএলিস্পেনিসফিউশন ()" $ মাইভাল নਾਲ না হলেও ফাংশনটি কল করবে। আমি মনে করি স্ক্রিপ্টব্লকগুলি ব্যবহার করে কোনও মূল্যায়ন বিলম্ব করতে পারে, তবে সচেতন থাকুন যে স্ক্রিপ্টব্লকগুলি ক্লোজার নয়, এবং জিনিসগুলি জটিল হয়ে উঠতে শুরু করবে।
টমাস এস ট্রায়াস

কঠোর মোডে কাজ করে না - এটি ছুড়ে দেয় The variable '$myval' cannot be retrieved because it has not been set.
BrainSlugs83

1
@ BrainSlugs83 আপনি যে ত্রুটিটি কঠোর মোডে দেখছেন তা নাল কোয়েলসিং বিকল্পগুলির সাথে সম্পর্কিত নয়। এটি কেবল স্ট্যান্ডার্ড, পাওয়ারশেল যাচাই করে নিচ্ছে যে কোনও ভেরিয়েবলটি প্রথমে সংজ্ঞায়িত করা হয়েছে। যদি আপনি $myval = $nullপরীক্ষা করার আগে সেট করেন তবে ত্রুটিটি চলে যাওয়া উচিত।
স্টিফেনডি

1
সতর্কতা, পাওয়ারশেল কৌতুক, নালকে সর্বদা তুলনা করা উচিত (বিশ্রীভাবে) প্রথমে নাল স্থাপন করা, অর্থাত্, $null -ne $a এখন শালীন রেফারেন্স খুঁজে পাওয়া যায় না, তবে এটি দীর্ঘকালীন অনুশীলন।
dudeNumber4

90

পাওয়ারশেল 7 এবং তারপরে

পাওয়ারশেল 7 অনেকগুলি নতুন বৈশিষ্ট্য উপস্থাপন করে এবং .NET ফ্রেমওয়ার্ক থেকে .NET কোরে স্থানান্তরিত করে। ২০২০ সালের মাঝামাঝি হিসাবে, এটি নেট কোরের উপর নির্ভরতার কারণে পাওয়ারশেলের লেগ্যাসি সংস্করণগুলি সম্পূর্ণরূপে প্রতিস্থাপন করেনি, তবে মাইক্রোসফ্ট ইঙ্গিত দিয়েছে যে তারা শেষ পর্যন্ত উত্তরসূরি ফ্রেমওয়ার্ক পরিবারটি প্রতিস্থাপনের জন্য কোর পরিবারকে উদ্দেশ্য করে। আপনি এটি পড়ার সময়, পাওয়ারশেলের একটি সামঞ্জস্যপূর্ণ সংস্করণ আপনার সিস্টেমে প্রাক ইনস্টল হতে পারে; যদি তা না হয় তবে https://github.com/powershell/powershell দেখুন

প্রতি ডকুমেন্টেশন নিম্নলিখিত অপারেটার আউট-অফ-বক্স PowerShell 7.0 এ সমর্থিত:

  1. নাল-কোলেসিং :??
  2. নাল-কোলেসিং অ্যাসাইনমেন্ট :??=
  3. টেরিনারি :... ? ... : ...

নাল কোলেসিংয়ের জন্য আপনি যেভাবে আশা করবেন তা এই কাজগুলি:

$x = $a ?? $b ?? $c ?? 'default value'
$y ??= 'default value'

যেহেতু একটি টার্নারি অপারেটর চালু করা হয়েছে, নিম্নলিখিতটি এখনই সম্ভব, যদিও এটি নাল কোয়েলসিং অপারেটরের সংযোজনের কারণে অপ্রয়োজনীয়:

$x = $a -eq $null ? $b : $a

.0.০ হিসাবে, ডক্সে বর্ণিত ( 1 , 2 ) হিসাবে PSNullConditionalOperatorsisচ্ছিক বৈশিষ্ট্য সক্ষম থাকলে নিম্নলিখিতগুলিও উপলভ্য :

  1. সদস্যদের জন্য নাল-কন্ডিশনাল সদস্য অ্যাক্সেস: ?.
  2. অ্যারে এবং অন্যান্য জন্য নাল-কন্ডিশনাল সদস্য অ্যাক্সেস: ?[]

এগুলিতে কয়েকটি সতর্কতা রয়েছে:

  1. যেহেতু এগুলি পরীক্ষামূলক, সেগুলি পরিবর্তন সাপেক্ষে। আপনি যখন এটি পড়েন ততক্ষণ এগুলি পরীক্ষামূলক হিসাবে বিবেচিত হবে না এবং সাবধানতার তালিকার পরিবর্তন হতে পারে।
  2. ভেরিয়েবলগুলি অবশ্যই ${}পরীক্ষামূলক অপারেটরগুলির মধ্যে একটির সাথে সংযুক্ত থাকতে হবে কারণ ভেরিয়েবলের নামে প্রশ্ন চিহ্নের অনুমতি রয়েছে। এটি অস্পষ্ট কিনা / যখন বৈশিষ্ট্যগুলি পরীক্ষামূলক স্থিতি থেকে স্নাতক হয় ( সমস্যা # 11379 দেখুন )। উদাহরণস্বরূপ, ${x}?.Test()নতুন অপারেটর ব্যবহার করে, কিন্তু $x?.Test()রান Test()নামে একটি পরিবর্তনশীল উপর $x?
  3. ?(আপনি টাইপ স্ক্রিপ্ট থেকে এসেছেন কিনা এমন কোনও অপারেটর যেমনটি আপনি আশা করতে পারেন তেমন নেই । নিম্নলিখিতগুলি কাজ করবে না:$x.Test?()

পাওয়ারশেল 6 এবং তার আগেরটি

7 এর পূর্বে পাওয়ারশেলের সংস্করণগুলিতে একটি আসল নাল কোলেসিং অপারেটর বা কমপক্ষে কোনও অপারেটর রয়েছে যা এই জাতীয় আচরণে সক্ষম। অপারেটরটি হ'ল -ne:

# Format:
# ($a, $b, $c -ne $null)[0]
($null, 'alpha', 1 -ne $null)[0]

# Output:
alpha

এটি নাল কোলেসিং অপারেটরের চেয়ে কিছুটা বহুমুখী, যেহেতু এটি সমস্ত নাল আইটেমগুলির একটি অ্যারে করে:

$items = $null, 'alpha', 5, 0, '', @(), $null, $true, $false
$instances = $items -ne $null
[string]::Join(', ', ($instances | ForEach-Object -Process { $_.GetType() }))

# Result:
System.String, System.Int32, System.Int32, System.String, System.Object[],
System.Boolean, System.Boolean

-eq একইভাবে কাজ করে, যা নাল এন্ট্রি গণনা করার জন্য দরকারী:

($null, 'a', $null -eq $null).Length

# Result:
2

তবে যাইহোক, এখানে সি # এর ??অপারেটরকে মিরর করার একটি সাধারণ কেস রয়েছে :

'Filename: {0}' -f ($filename, 'Unknown' -ne $null)[0] | Write-Output

ব্যাখ্যা

এই ব্যাখ্যাটি একজন অনামী ব্যবহারকারীর সম্পাদনা পরামর্শের ভিত্তিতে। ধন্যবাদ, আপনি যে কেউ!

ক্রিয়াকলাপের ক্রমের ভিত্তিতে, এটি নিম্নলিখিত ক্রমে কাজ করে:

  1. ,অপারেটর মূল্যবোধের একটি অ্যারের পরীক্ষা করা হয়।
  2. -neএই ক্ষেত্রে, নাল - অ্যারের নির্দিষ্ট করা মানের মেলে থেকে কোন আইটেম অপারেটর ফিল্টার। ফলাফলটি পদক্ষেপ 1-এ তৈরি করা অ্যারের মতো একই ক্রমে নন-নাল মানগুলির একটি অ্যারে।
  3. [0] ফিল্টার করা অ্যারের প্রথম উপাদানটি নির্বাচন করতে ব্যবহৃত হয়।

সরলকরণ:

  1. পছন্দসই ক্রমে সম্ভাব্য মানগুলির একটি অ্যারে তৈরি করুন
  2. অ্যারে থেকে সমস্ত নাল মান বাদ দিন
  3. ফলাফল অ্যারে থেকে প্রথম আইটেম নিন

আদেশ সহকারে

সি # এর নাল কোয়েলসিং অপারেটরের বিপরীতে, প্রতিটি সম্ভাব্য এক্সপ্রেশন মূল্যায়ন করা হবে, যেহেতু প্রথম পদক্ষেপটি অ্যারে তৈরি করা।


আমি আপনার উত্তরের বিষয়ে একটি পরিবর্তিত সংস্করণ ব্যবহার শেষ পর্যন্ত খনিতে কারণ আমি একটি ব্যতিক্রম নিক্ষেপ ছাড়া, একসঙ্গে বেড়ে ওঠা সমস্ত দৃষ্টান্ত নাল হতে দিয়ে প্রয়োজন। এটি করার খুব সুন্দর উপায় যদিও আমাকে অনেক কিছু শিখেছে। :)
জনি স্কোভডাল

এই পদ্ধতিটি সংক্ষিপ্ত প্রদাহ রোধ করে। এটি দেখতে সংজ্ঞা দিন function DidItRun($a) { Write-Host "It ran with $a"; return $a }এবং চালান run ((DidItRun $null), (DidItRun 'alpha'), 1 -ne $null)[0]
jpmc26

@ jpmc26 হ্যাঁ, এটি নকশা দ্বারা।
জেনেক্সার

কোনও কোলেসেস ফাংশন সংজ্ঞায়িত করার কোনও প্রচেষ্টা শর্ট সার্কিটগুলিও বাদ দিতে পারে তাই না?
ক্রিস এফ ক্যারল

8
আহহহ পাওয়ারশেলের অপারেটর অগ্রাধিকার আমাকে মেরে ফেলে! আমি সর্বদা ভুলে যাই যে কমা অপারেটরের ,এমন উচ্চতর নজির রয়েছে। এটি যেভাবে কাজ করে সে সম্পর্কে বিভ্রান্ত যে কেউ, ($null, 'alpha', 1 -ne $null)[0]তার মতোই (($null, 'alpha', 1) -ne $null)[0]। প্রকৃতপক্ষে কেবলমাত্র দুটি "ড্যাশ" অপারেটর উচ্চতর প্রাধান্য সহ -splitএবং -join(এবং অ্যানারি ড্যাশ? অর্থাত্। -4বা -'56')।
প্লুটো

15

এটি প্রশ্নের প্রথমার্ধের অর্ধেক উত্তর, সুতরাং আপনি যদি চান তবে এক চতুর্থাংশ উত্তর, তবে নাল কোলেসিং অপারেটরের অনেক সহজ বিকল্প রয়েছে আপনি যে ডিফল্ট মানটি ব্যবহার করতে চান তা আসলে ধরণের ডিফল্ট মান :

string s = myval ?? "";

পাওয়ারশেল এ হিসাবে লেখা যেতে পারে:

([string]myval)

অথবা

int d = myval ?? 0;

পাওয়ারশেল অনুবাদ:

([int]myval)

আমি এই এক্সএলএমএল উপাদানটির প্রক্রিয়া করার সময় এই দরকারীটির মধ্যে প্রথমটি খুঁজে পেয়েছি যা সম্ভবত উপস্থিত নেই এবং যা যদি এটি উপস্থিত থাকে তবে এটি অবাঞ্ছিত শ্বেতস্পেস থাকতে পারে:

$name = ([string]$row.td[0]).Trim()

কাস্ট টু স্ট্রিং উপাদানটি নাল হওয়া থেকে রক্ষা করে এবং Trim()ব্যর্থ হওয়ার কোনও ঝুঁকি প্রতিরোধ করে ।


([string]$null)-> ""একটি "দরকারী, কিন্তু দুর্ভাগ্যজনক পার্শ্ব প্রতিক্রিয়া" বলে মনে হচ্ছে :(
ব্যবহারকারী 2864740


9

আপনি যদি পাওয়ারশেল সম্প্রদায় সম্প্রসারণ মডিউলটি ইনস্টল করেন তবে আপনি এটি ব্যবহার করতে পারেন:

?? ইনভোক-নলকোলেসেসিংয়ের জন্য উপনাম।

$s = ?? {$myval}  {"New Value"}

?: ইনভোক-টেরনারির নাম।

$x = ?: {$myval -eq $null} {""} {$otherval}

আসলে, এটি পাওয়ারশেলের কমান্ড নয়। আপনি তাদেরকে পিএসএসএক্সের সাথে একত্রিত করেছেন:?: -> ইনভোক-
টার্নারি

... প্রকৃত কোড এবং ফলাফল মিস হয়েছে ..;) গেট-কমান্ড-মডুল পিএসসিএক্স -কম্যান্ডটাইপ ওরফে | কোথায় {$ _। নাম-ম্যাচ '\ ?.' } | foreach {"{0}: {1}" -f $ _। নাম, $ _। সংজ্ঞা}?:: ইনভোক-টার্নারি ?? : ইনভোক-নুলকোলেসিং
বারটেকবি

উফ ... আপনি সম্পূর্ণ সঠিক আমি প্রায়শই ভুলে যাই যে আমার এমনকি সেই মডিউলটি লোড হচ্ছে।
ইবিগ্রিন



2
function coalesce {
   Param ([string[]]$list)
   #$default = $list[-1]
   $coalesced = ($list -ne $null)
   $coalesced[0]
 }
 function coalesce_empty { #COALESCE for empty_strings

   Param ([string[]]$list)
   #$default = $list[-1]
   $coalesced = (($list -ne $null) -ne '')[0]
   $coalesced[0]
 }

2

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

এই ফাংশনটির একটি সুবিধা হ'ল এটি ব্যতিক্রম ছুঁড়ে না ফেলে সমস্ত উপাদান নাল (বা খালি) থাকাও পরিচালনা করে। পাওয়ারশেল অ্যারে ইনপুটগুলি কীভাবে পরিচালনা করে তা ধন্যবাদ, এটি অনেকগুলি ইনপুট ভেরিয়েবলের জন্যও ব্যবহার করা যেতে পারে।

function Coalesce([string[]] $StringsToLookThrough, [switch]$EmptyStringAsNull) {
  if ($EmptyStringAsNull.IsPresent) {
    return ($StringsToLookThrough | Where-Object { $_ } | Select-Object -first 1)
  } else {
    return (($StringsToLookThrough -ne $null) | Select-Object -first 1)
  }  
}

এটি নিম্নলিখিত পরীক্ষার ফলাফল উত্পাদন করে:

Null coallesce tests:
1 (w/o flag)  - empty/null/'end'                 : 
1 (with flag) - empty/null/'end'                 : end
2 (w/o flag)  - empty/null                       : 
2 (with flag) - empty/null                       : 
3 (w/o flag)  - empty/null/$false/'end'          : 
3 (with flag) - empty/null/$false/'end'          : False
4 (w/o flag)  - empty/null/"$false"/'end'        : 
4 (with flag) - empty/null/"$false"/'end'        : False
5 (w/o flag)  - empty/'false'/null/"$false"/'end': 
5 (with flag) - empty/'false'/null/"$false"/'end': false

পরীক্ষার কোড:

Write-Host "Null coalesce tests:"
Write-Host "1 (w/o flag)  - empty/null/'end'                 :" (Coalesce '', $null, 'end')
Write-Host "1 (with flag) - empty/null/'end'                 :" (Coalesce '', $null, 'end' -EmptyStringAsNull)
Write-Host "2 (w/o flag)  - empty/null                       :" (Coalesce('', $null))
Write-Host "2 (with flag) - empty/null                       :" (Coalesce('', $null) -EmptyStringAsNull)
Write-Host "3 (w/o flag)  - empty/null/`$false/'end'          :" (Coalesce '', $null, $false, 'end')
Write-Host "3 (with flag) - empty/null/`$false/'end'          :" (Coalesce '', $null, $false, 'end' -EmptyStringAsNull)
Write-Host "4 (w/o flag)  - empty/null/`"`$false`"/'end'        :" (Coalesce '', $null, "$false", 'end')
Write-Host "4 (with flag) - empty/null/`"`$false`"/'end'        :" (Coalesce '', $null, "$false", 'end' -EmptyStringAsNull)
Write-Host "5 (w/o flag)  - empty/'false'/null/`"`$false`"/'end':" (Coalesce '', 'false', $null, "$false", 'end')
Write-Host "5 (with flag) - empty/'false'/null/`"`$false`"/'end':" (Coalesce '', 'false', $null, "$false", 'end' -EmptyStringAsNull)

1

নিকটতম আমি পেতে পারি: $Val = $MyVal |?? "Default Value"

আমি উপরেরটির জন্য নাল কোলেসিং অপারেটরটিকে এভাবে প্রয়োগ করেছি :

function NullCoalesc {
    param (
        [Parameter(ValueFromPipeline=$true)]$Value,
        [Parameter(Position=0)]$Default
    )

    if ($Value) { $Value } else { $Default }
}

Set-Alias -Name "??" -Value NullCoalesc

শর্তাধীন তিন অপারেটর একটি similary ভাবে বাস্তবায়িত করা যায়নি।

function ConditionalTernary {
    param (
        [Parameter(ValueFromPipeline=$true)]$Value,
        [Parameter(Position=0)]$First,
        [Parameter(Position=1)]$Second
    )

    if ($Value) { $First } else { $Second }
}

Set-Alias -Name "?:" -Value ConditionalTernary

এবং ব্যবহৃত: $Val = $MyVal |?: $MyVal "Default Value"

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