উত্তর:
এটি পাইপ লাইনের বর্তমান মানের জন্য পরিবর্তনশীল, যা $PSItem
পাওয়ারশেল 3 এবং আরও নতুন বলা হয়।
1,2,3 | %{ write-host $_ }
অথবা
1,2,3 | %{ write-host $PSItem }
উদাহরণস্বরূপ উপরের কোডে %{}
অ্যারেতে প্রতিটি মানের জন্য ব্লকটি বলা হয়। $_
বা $PSItem
পরিবর্তনশীল বর্তমান মান থাকতে হবে।
ForEach-Object
বা Where-Object
আপনি এটি কোনওরকম ব্যবহার করতে পারবেন না Get-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)
- সেখানে একটি পাইপলাইন জড়িত রয়েছে, তবে কোনও স্ক্রিপ্ট ব্লক নেই এবং তাই নেই $_
। (এটি বলা হচ্ছে, পাওয়ারশেল সহায়তা পাইপলাইনের জন্যও বোঝায় $_
Conf বিভ্রান্তিমূলক))
Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar
... ওয়েল, এটা করতে পারেন যদি আপনি একটি আছে কাজ $_
সুযোগ যেখানে আপনি যে পাইপলাইন নির্বাহ করছি না। তবে এরকম কিছু লেখার চেষ্টা করার সময় আপনি সাধারণত যা বোঝাতে চেয়েছেন তা থেকে এটি আলাদা।
$_
আপনি যা লিখেছেন তা হ'ল কোনও কারণে, সমস্ত বস্তুর লুপিং নয়। পরিবর্তে এটি চেষ্টা করুন। gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
। আমার সন্দেহ হয় যে gci | cmdlet
সুস্পষ্ট পূর্বাভাস ব্যতীত হ'ল জিসিআই ফলাফল সংগ্রহ করা এবং সেমিডলেটটিতে একটি অ্যারে পাস করা হয়। তবে অ্যারে হ'ল একটি বস্তু, সুতরাং এটি অ্যারে অবজেক্টে একটি সম্পত্তি যুক্ত করে। অ্যারেতে 'নাম' বৈশিষ্ট্য নেই, তাই $ _ কে বরাদ্দ করা মান Bar _ বারটি $ নাল। নীচের লাইনটি হ'ল $ _ ব্যাপকভাবে ডাব্লু / পাইপলাইনে ব্যবহৃত হয়। লুপটি করতে% {need এর দরকার নেই নতুন।
gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
আমি সি # তে ল্যাম্বডা এক্সপ্রেশনটিতে ইনপুট প্যারামিটারের মতো এই পরিবর্তনশীলটি সম্পর্কে ভাবার সবচেয়ে সহজ উপায় বলে মনে করি। অর্থাৎ সি # তে বেনামে ফাংশনের $_
মতো । নিম্নলিখিত উদাহরণগুলি বিবেচনা করুন:x
x => Console.WriteLine(x)
শক্তির উৎস:
1,2,3 | ForEach-Object {Write-Host $_}
ছাপে:
1
2
3
অথবা
1,2,3 | Where-Object {$_ -gt 1}
ছাপে:
2
3
এবং এটি লিনিকিউ ব্যবহার করে সি # সিনট্যাক্সের সাথে তুলনা করুন:
var list = new List<int> { 1, 2, 3 };
list.ForEach( _ => Console.WriteLine( _ ));
ছাপে:
1
2
3
অথবা
list.Where( _ => _ > 1)
.ToList()
.ForEach(s => Console.WriteLine(s));
ছাপে:
2
3
_
তে ল্যাম্বডায় ইনপুট প্যারামিটার হিসাবে ব্যবহার করবেন না । _
প্যারামিটারগুলি উপেক্ষা করার সময় কখনও কখনও ব্যবহৃত হয়, পরিবর্তে এক্স ব্যবহার করুন। stackoverflow.com/questions/424775/…
এই ওয়েবসাইট অনুসারে , এটি একটি উল্লেখ this
, বেশিরভাগ লুপগুলিতে in
TH _ (ডলার আন্ডারস্কোর) 'এই' টোকেন। সাধারণত একটি foreach লুপ ভিতরে আইটেম বোঝায়। কার্য: একটি সংগ্রহে সমস্ত আইটেম মুদ্রণ করুন। সমাধান। ... | foreach {লিখন-হোস্ট $ _}
this
$_
পরিবর্তনশীল জন্য একটি বরং বিভ্রান্তিকর শব্দ । ওওপি-তে এটি সাধারণত শ্রেণিকে বোঝায়, পরিবর্তনশীল নয়।
$: _ স্বয়ংক্রিয় পরিবর্তনশীল $ PSItem জন্য একটি alias আছে (PowerShell v3.0 চালু; ব্যবহারের তথ্য এখানে পাওয়া ) যা পাইপ থেকে বর্তমান আইটেমটি প্রতিনিধিত্ব করে।
স্বয়ংক্রিয় চলকগুলির জন্য পাওয়ারশেল (v6.0) অনলাইন ডকুমেন্টেশন এখানে ।
$_
সিস্টেম দ্বারা নির্মিত একটি পরিবর্তনশীল যা সাধারণত ব্লক এক্সপ্রেশনগুলির অভ্যন্তরে থাকে এবং সেমিপ্লেটগুলি রেফার করে যা পাইপের সাথে ব্যবহার করা হয় যেমন Where-Object
এবং ForEach-Object
।
তবে এটি অন্যান্য ধরণের অভিব্যক্তিতেও ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ Select-Object
অভিব্যক্তি বৈশিষ্ট্যের সাথে মিলিত। Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
। এই ক্ষেত্রে$_
আইটেমটি পাইপ করা হচ্ছে প্রতিনিধিত্ব করে তবে একাধিক অভিব্যক্তি উপস্থিত থাকতে পারে।
এটি কাস্টম প্যারামিটার বৈধতা দ্বারাও উল্লেখ করা যেতে পারে, যেখানে কোনও মানকে বৈধ করার জন্য স্ক্রিপ্ট ব্লক ব্যবহৃত হয়। এই ক্ষেত্রে $_
প্রার্থনা থেকে প্রাপ্ত প্যারামিটার মানটি উপস্থাপন করে।
সি # এবং জাভা এর নিকটতম উপমা লামদা এক্সপ্রেশন। আপনি যদি পাওয়ারসেলকে বেসিকগুলিতে ভাঙেন তবে সবকিছুই একটি স্ক্রিপ্ট ব্লক যার মধ্যে একটি স্ক্রিপ্ট ফাইল একটি, ফাংশন এবং সেমিডলেট রয়েছে। আপনি নিজের প্যারামিটারগুলি সংজ্ঞায়িত করতে পারেন তবে কিছু ক্ষেত্রে আপনার দ্বারা সিস্টেম তৈরি করা হয় যা প্রক্রিয়া / মূল্যায়নের জন্য ইনপুট আইটেমকে উপস্থাপন করে । এই পরিস্থিতিতে স্বয়ংক্রিয় পরিবর্তনশীল হয় $_
।