পাওয়ারশেল কেন নিঃশব্দে একটি আইটেমের সাথে একটি স্ট্রিং অ্যারে স্ট্রিংয়ে রূপান্তর করে


33

নিম্নলিখিত পাওয়ারশেল লিপিটি বিবেচনা করুন, যা সিতে ফোল্ডারগুলি অনুসন্ধান করে: \ তাদের নামে একটি 'ওগ' সহ:

PS সি: \> (ls |% {$ _। নাম} |? {$ _। এতে রয়েছে ("ওগ")})
PerfLogs
প্রোগ্রাম ফাইল
setup.log

কেবলমাত্র একটি আইটেম পাওয়ার জন্য আমি অনুসন্ধানটি সঙ্কুচিত করে রেখেছি:

PS C: \> (ls |% {$ _। নাম} |? {$ _। এতে রয়েছে ("প্রোগ্রাম")})
প্রোগ্রাম ফাইল

আশ্চর্যের বিষয়টি হ'ল প্রথম অপারেশনটি একটি অ্যারে দেয় , যখন দ্বিতীয় অপারেশন (যা আইএমএইচও অর্থাত্ একই ক্রিয়াকলাপ, তাই এটি একই ধরণের ফলাফল পাওয়া উচিত) একটি স্ট্রিং দেয় । এটি নিম্নলিখিত ফলাফলটিতে দেখা যায়:

PS C: \> (ls |% {$ _। নাম} |? {$ _। এতে রয়েছে ("ওগ")})। দৈর্ঘ্য
3
পিএস সি: \> (ls |% {$ _। নাম} |? {$ _। এতে রয়েছে ("প্রোগ্রাম")}) দৈর্ঘ্য।
13

এটি খুব বিরক্তিকর হতে পারে, যেহেতু দৃশ্যত এমন কিছু ফোল্ডার রয়েছে যা 'প্রোগ্রাম' এর সাথে মেলে তাদের চেয়ে 'ওগ' মেলে।

স্পষ্টতই, পাওয়ারশেল স্পষ্টতই একটি একক বস্তুর কাছে একটি একক আইটেম অ্যারে আনবক্স করে 'এবং আমরা কখনই দৈর্ঘ্যের একটি অ্যারে পাই না বলে মনে হয় প্রতিবার পাইপলাইনের উপর দিয়ে আসা ফলাফলগুলি গণনা করতে চাইলে, আমাকে পরীক্ষা করে দেখতে হবে কিনা' আমি একটি অ্যারের সঙ্গে ডিল বা না।

কীভাবে আমি এটি হতে রোধ করতে পারি? এটার সাথে তুমি কিভাবে চুক্তি করলে?


Stackoverflow থেকে এই সাহায্য করতে পারেন: stackoverflow.com/questions/1827862/... stackoverflow.com/questions/1390782/... আপনাকে বংশীধ্বনিতুল্য ছিল না $_.Contains, তারপর %{,,$_.Name}কাজ করে ...
বব

উত্তর:


56

স্পষ্টতই, পাওয়ারশেল স্পষ্টভাবে একক আইটেমের জন্য একটি একক-আইটেম অ্যারে স্পষ্টভাবে 'আনবক্সে',

এবং শূন্য আইটেম ফলাফল $null

কীভাবে আমি এটি হতে রোধ করতে পারি?

আপনি পারবেন না।

এটার সাথে তুমি কিভাবে চুক্তি করলে?

@(...)কোনও সংগ্রহকে জোর করতে (সম্ভবত শূন্য বা একটি উপাদান সহ) ফিরে আসতে অ্যারে কনস্ট্রাক্টর ( ) ব্যবহার করুন :

$res = @(ls | %{$_.Name} | ?{$_.Contains("Prog")})

ধন্যবাদ, এটি নিখুঁত! আমার 15 খ্যাতি পাওয়া মাত্রই আমি উত্সাহিত করব।
চিজাস এসও মনিকা

2
আপনি এটি "জোর" করতে পারবেন তা নিশ্চিত নন। @(1) | ConvertTo-Jsonএখনও 1পরিবর্তে ফিরে [1]
মার্ক

@ মার্ক: ConvertTo-Jsonকোনও সংগ্রহ কখনই ফেরায় না: এটি পুরো ইনপুটটি পড়ে এবং একটি স্ট্রিংতে রূপান্তর করে। আপনি যদি ইনপুট অবজেক্টগুলি স্বতন্ত্রভাবে রূপান্তর করতে চান তবে আপনাকে প্রতিটি পৃথকভাবে প্রক্রিয়া করতে হবে।
রিচার্ড

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

@ মার্ক এই প্রশ্নের মূল বক্তব্য হ'ল সেই উপাদান হিসাবে কোনও একক অ্যারের অ্যারেটির চিকিত্সা এড়ানো (যা পরবর্তী পিএসএইচ পরিবর্তনের কারণে কোনও ইস্যুতে কম নয়: প্রশ্নের তারিখটি নোট করুন)। আপনি সম্পূর্ণ ভিন্ন মামলার কথা বলছেন (কোনও সংগ্রহকে একক বস্তু হিসাবে বাধ্য করতে) তাই আমার ভুল বোঝাবুঝি।
রিচার্ড

2

এটি পাওয়ারশেল v3 এ সমাধান করা হয়েছে:

http://blogs.microsoft.co.il/blogs/scriptfanatic/archive/2012/03/19/Counting-objects-in-PowerShell-3.0.aspx

পার্শ্ব নোটে আপনি খুঁজে পেতে পারেন যে কোনও নামটিতে একটি ওয়াইল্ডকার্ড ব্যবহার করে কিছু রয়েছে:

PS> ls *og*

6
শাই , আমি এখনও উত্তর সম্পর্কে মন্তব্য করতে পারবেন না, কিন্তু আপনার বক্তব্য সত্য নয়। পাওয়ারশেল এখনও উপাদানগুলিকে বাক্স করে তবে এটি যেমন আপনি উল্লেখ করেছেন যে একক আইটেমকে "গণনা" মান দেওয়া হয়েছে। যদিও একক আইটেমের ফলাফলগুলি এখনও আনবক্সড রয়েছে। আপনি PS 3 এর বিপরীতে উপরের উদাহরণটি পরীক্ষা করতে পারেন এবং ফলাফলগুলি দেখতে পারেন।
তোহু

1
আচরণটি PS 5 তে এখনও একইরকম
মেমার্ক

হ্যাঁ, ডিএফ এখনও উপস্থিত রয়েছে
জেমস উইজম্যান

1
এই আচরণটি PS 6.0.1
স্পুডার

2

এই দুটি ফলাফলের মধ্যে পার্থক্যটি নোট করুন:

PS C:\> ConvertTo-Json -InputObject @(1)
[
    1
]
PS C:\> @(1)|ConvertTo-Json
1
PS C:\>

মুল বক্তব্যটি হ'ল পাইপ অপারেশন করে 'আনবক্সিং' করা হচ্ছে। কনভার্টটো-জসন এখনও যদি পাইপিংয়ের পরিবর্তে ইনপুটঅবজেক্টটি ব্যবহার করে তবে অবজেক্টটিকে একটি অ্যারে হিসাবে দেখবে।

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