Powershell चुपचाप एक आइटम के साथ स्ट्रिंग को एक स्ट्रिंग में कैसे परिवर्तित करता है


33

निम्नलिखित पॉवर्सशेल स्क्रिप्ट पर विचार करें, जो C: \ में अपने नाम में 'og' के साथ फ़ोल्डर खोजता है:

PS C: \> (ls |% {$ _। Name} | {$ _। समाहित है ("og")})
PerfLogs
कार्यक्रम फाइलें
Setup.log

अब मैं केवल एक वस्तु प्राप्त करने के लिए खोज को संकुचित करता हूं:

PS C: \> (ls |% {$ _। Name} | {$ _। समाहित है ("प्रोग")) "
कार्यक्रम फाइलें

अजीब बात यह है कि पहला ऑपरेशन एक सरणी देता है , जबकि दूसरा ऑपरेशन (जो कि आईएमएचओ शब्दार्थ रूप से एक ही ऑपरेशन है, इसलिए इसे एक ही प्रकार के परिणाम प्राप्त करना चाहिए) एक स्ट्रिंग पैदा करता है । इसे निम्नलिखित परिणाम में देखा जा सकता है:

PS C: \> (ls |% {$ _। Name} | {$ _। समाहित है ("og))") लंबाई।
3
PS C: \> (ls |% {$ _। Name} | {$ _। समाहित है ("Prog))}। लंबाई
13

यह बहुत परेशान कर देने वाला हो सकता है, क्योंकि जाहिर तौर पर 'ओग' से मैच करने वालों की तुलना में 'ओग' से कम फोल्डर होते हैं।

जाहिर है, PowerShell ने एक वस्तु के लिए एक एकल-वस्तु सरणी को 'unboxes' कहा है, और हमें लंबाई 1. कभी नहीं मिलती है। ऐसा लगता है कि हर बार जब मैं पाइपलाइन पर आने वाले परिणामों को गिनना चाहता हूं, तो मुझे जांचना होगा कि क्या मैं ' एक सरणी या नहीं के साथ काम कर रहा हूँ।

मेरे द्वारा इसे होने से कैसे रोका जा सकता है? आप इस के साथ कैसे पेश आएंगे?


StackOverflow से ये मदद कर सकते हैं: stackoverflow.com/questions/1827862/… stackoverflow.com/questions/1390782/… यदि आप पाइप नहीं कर रहे थे $_.Contains, तो %{,,$_.Name}काम करता है ...
Bob

जवाबों:


56

जाहिर तौर पर, PowerShell ने एक वस्तु के लिए एक एकल-आइटम सरणी को 'अनबॉक्स' कहा।

और शून्य आइटम परिणाम $null

मेरे द्वारा इसे होने से कैसे रोका जा सकता है?

आप नहीं कर सकते।

आप इस के साथ कैसे पेश आएंगे?

@(...)एक संग्रह (संभवतः शून्य या एक तत्व के साथ) को वापस करने के लिए सरणी कंस्ट्रक्टर ( ) का उपयोग करें :

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

धन्यवाद, यह एकदम सही है! जैसे ही मेरी प्रतिष्ठा होगी, मैं 15 साल का हो जाऊंगा।
चीज़स SO SO

2
सुनिश्चित नहीं हैं कि आप इसे "मजबूर" कर सकते हैं। @(1) | ConvertTo-Jsonके 1बजाय अभी भी लौटता है [1]
मार्क

@Marc: ConvertTo-Jsonकभी भी एक संग्रह नहीं लौटाता है: यह पूरा इनपुट पढ़ता है और एक स्ट्रिंग में परिवर्तित होता है। यदि आप व्यक्तिगत रूप से परिवर्तित इनपुट ऑब्जेक्ट चाहते हैं, तो आपको प्रत्येक को अलग से संसाधित करने की आवश्यकता होगी।
रिचर्ड

1
@ रिचर्ड, मुझे लगता है कि आप गलत समझ रहे हैं: मैं, और कई अन्य, मूल रूप से संपूर्ण वस्तु (यानी संग्रह) को क्रमबद्ध (जैसे बाहरी दृढ़ता के लिए) चाहते हैं। हम संग्रह में प्रत्येक वस्तु को अलग से संसाधित करने में रुचि नहीं रखते हैं। ConvertTo-Json को एक स्ट्रिंग वापस करनी चाहिए, जो अगर रन करता है, तो ConvertFrom-Json एक खाली सरणी / संग्रह के मूल ऑब्जेक्ट को वापस कर देता है।
मार्क

@Marc इस प्रश्न का बिंदु एकल तत्व सरणी के उपचार से बचना है क्योंकि वह तत्व (जो बाद के PSH परिवर्तनों के कारण किसी समस्या से कम है: प्रश्न की तारीख नोट करें)। आप एक पूरी तरह से अलग मामले के बारे में बात कर रहे हैं (एक एकल वस्तु होने के लिए एक संग्रह को मजबूर करना) इसलिए मुझे गलतफहमी है।
रिचर्ड

2

यह PowerShell v3 में हल किया गया है:

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

साइड नोट पर, आप पा सकते हैं कि क्या किसी नाम में वाइल्डकार्ड का उपयोग करने वाला कुछ है:

PS> ls *og*

6
शाय , मैं अभी तक उत्तरों पर टिप्पणी नहीं कर सकता, लेकिन आपका कथन सत्य नहीं है। PowerShell अभी भी तत्वों को बॉक्स करता है, लेकिन उनके पास, जैसा कि आपने उल्लेख किया है, एकल आइटमों को "गणना" मान दिया है। एकल आइटम परिणाम अभी भी अनबॉक्स हैं, हालांकि। आप पीएस 3 के खिलाफ उपरोक्त उदाहरण का परीक्षण कर सकते हैं और परिणाम देख सकते हैं।
तोहुव

1
व्यवहार अभी भी PS 5 में समान है
मेमार्क

हां, अभी भी मौजूद है
जेम्स विस्मैन

1
यह व्यवहार अभी भी PS 6.0.1 में समान है
spuder

2

इन दो परिणामों के बीच अंतर पर ध्यान दें:

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

मुद्दा यह है कि पाइप ऑपरेशन द्वारा 'अनबॉक्सिंग' किया जा रहा है। ConvertTo-Json अभी भी ऑब्जेक्ट को सरणी के रूप में देखता है अगर हम पाइपिंग के बजाय InputObject का उपयोग करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.