दिलचस्प पोस्ट
Module.exports में किसी अन्य फ़ंक्शन से मॉड्यूल.एक्सपोर्ट के भीतर एक "स्थानीय" फ़ंक्शन को कॉल करें? लंबाई क्यों 2 तत्वों के साथ एक ट्यूपल के लिए 1 देता है, और अधिक तत्वों के साथ ट्यूपल के लिए एक त्रुटि देता है? पोर्टेबल कोड को सी ++ में कैसे लिखें? क्या एक प्रतिनिधि को विशेषता पैरामीटर के रूप में संभव है? संशोधित पॉइंटर के माध्यम से स्ट्रिंग को अपने डेटा में क्यों अनुमत नहीं है? ऑब्जेक्ट्स और एरेज़ अतिरिक्त परमिको में इंटरैक्टिव कमांड चलाना Textarea के लिए घटना का आकार बदलें? Bitwise shift (bit-shift) ऑपरेटरों और वे कैसे काम करते हैं? कैसे 'स्थानीय चर को प्रारंभ नहीं किया जा सकता है' से बचने के लिए? उद्देश्य-सी स्ट्रिंग से वर्ग गुण प्राप्त करें विम के अंधेरे कोने क्या हैं जो आपकी माँ ने आपको कभी नहीं बताया? in_array () और बहुआयामी सरणी Google मुखपृष्ठ एक iframe में लोड नहीं करेगा मुख्य थ्रेड में दूसरे थ्रेड से कोड चलाना

आप डबल-उद्धृत स्ट्रिंग में वस्तु की संपत्ति का उपयोग कैसे कर सकते हैं?

मेरे पास निम्न कोड है:

$DatabaseSettings = @(); $NewDatabaseSetting = "" | select DatabaseName, DataFile, LogFile, LiveBackupPath; $NewDatabaseSetting.DatabaseName = "LiveEmployees_PD"; $NewDatabaseSetting.DataFile = "LiveEmployees_PD_Data"; $NewDatabaseSetting.LogFile = "LiveEmployees_PD_Log"; $NewDatabaseSetting.LiveBackupPath = '\\LiveServer\LiveEmployeesBackups'; $DatabaseSettings += $NewDatabaseSetting; 

जब मैं एक स्ट्रिंग निष्पादित कमांड में गुणों में से एक का उपयोग करने का प्रयास करता हूं:

 & "$SQlBackupExePath\SQLBackupC.exe" -I $InstanceName -SQL ` "RESTORE DATABASE $DatabaseSettings[0].DatabaseName FROM DISK = '$tempPath\$LatestFullBackupFile' WITH NORECOVERY, REPLACE, MOVE '$DataFileName' TO '$DataFilegroupFolder\$DataFileName.mdf', MOVE '$LogFileName' TO '$LogFilegroupFolder\$LogFileName.ldf'" 

यह $DatabaseSettings[0].DatabaseName के मूल्य की बजाय $DatabaseSettings के मूल्य का उपयोग करने की कोशिश करता है $DatabaseSettings[0].DatabaseName , जो मान्य नहीं है।
मेरे समाधान के लिए यह एक नया चर में कॉपी किया गया है

मैं ऑब्जेक्ट की संपत्ति को सीधे डबल-उद्धृत स्ट्रिंग में कैसे पहुंच सकता / सकती हूं?

Solutions Collecting From Web of "आप डबल-उद्धृत स्ट्रिंग में वस्तु की संपत्ति का उपयोग कैसे कर सकते हैं?"

जब आप डबल-उद्धृत स्ट्रिंग में एक वैरिएबल नाम जोड़ते हैं तो इसे उस वैरिएबल के मान से बदल दिया जाएगा:

 $foo = 2 "$foo" 

हो जाता है

 "2" 

यदि आप नहीं चाहते हैं कि आपको सिंगल उद्धरणों का उपयोग करना है:

 $foo = 2 '$foo' 

हालांकि, अगर आप गुणों को एक्सेस करना चाहते हैं, या डबल-उद्धृत स्ट्रिंग में वेरिएबल्स पर अनुक्रमित का उपयोग करना चाहते हैं, तो आपको उस उप-एक्सप्रेशन को $() में जोड़ना होगा:

 $foo = 1,2,3 "$foo[1]" # yields "1 2 3[1]" "$($foo[1])" # yields "2" $bar = "abc" "$bar.Length" # yields "abc.Length" "$($bar.Length)" # yields "3" 

पावरलेल केवल उन मामलों में चर का विस्तार करते हैं, और कुछ नहीं। अनुक्रमित गुणों या पूर्ण गणनाओं सहित अधिक जटिल अभिव्यक्तियों के मूल्यांकन के लिए, आपको उन उप-एक्सप्रेसन ऑपरेटर $( ) जो स्ट्रिंग में मूल्यांकन और एम्बेड किए जाने के अंदर अभिव्यक्ति का कारण बनता है।

@जॉय का सही उत्तर है, लेकिन सिर्फ थोड़ा अधिक जोड़ने के लिए आपको $() साथ मूल्यांकन करने की आवश्यकता क्यों है:

आपके उदाहरण कोड में एक अस्पष्टता है जो बताता है कि क्यों PowerShell के निर्माताओं ने केवल चर संदर्भों के विस्तार को सीमित करने के लिए चुना है और साथ ही गुणों तक पहुंच का समर्थन नहीं किया है (एक अलग के रूप में: स्ट्रिंग विस्तार को ToString() विधि को कॉल करके किया जाता है ऑब्जेक्ट, जो कुछ "अजीब" परिणाम बता सकता है)।

आपका उदाहरण कमांड लाइन के अंत में समाहित है:

 ...\$LogFileName.ldf 

यदि ऑब्जेक्ट्स की संपत्तियां डिफ़ॉल्ट रूप से विस्तारित होती हैं, तो ऊपर से हल होगा

 ...\ 

चूंकि $LogFileName द्वारा संदर्भित ऑब्जेक्ट को ldf नामक एक संपत्ति नहीं होगी, $null (या रिक्त स्ट्रिंग) चर के लिए प्रतिस्थापित किया जाएगा

@ जॉय का एक अच्छा जवाब है String.Format समकक्ष के साथ और अधिक। NET देखने के साथ एक और तरीका है, मैं ऑब्जेक्ट पर गुणों को एक्सेस करते समय इसे पसंद करता हूं:

कार के बारे में बातें:

 $properties = @{ 'color'='red'; 'type'='sedan'; 'package'='fully loaded'; } 

एक वस्तु बनाएं:

 $car = New-Object -typename psobject -Property $properties 

स्ट्रिंग को दोहराएं:

 "The {0} car is a nice {1} that is {2}" -f $car.color, $car.type, $car.package 

आउटपुट:

 # The red car is a nice sedan that is fully loaded 

प्रलेखन नोट: Get-Help about_Quoting_Rules स्ट्रिंग प्रक्षेपण को शामिल करता है, लेकिन, PSv5 के रूप में, गहराई से नहीं।

जोय के सहायक उत्तर को पावरशेल्स के स्ट्रिंग विस्तार ( डबल-उद्धृत स्ट्रिंग्स में स्ट्रिंग प्रक्षेपण, जिसमें डबल-उद्धृत यहां स्ट्रिंग शामिल हैं ) के व्यावहारिक सारांश के साथ पूरक हैं:

  • केवल $foo , $global:foo (या $script:foo , …) और $env:PATH (पर्यावरण चर) जैसे संदर्भों को सीधे संदर्भित किया जाता है जब "..." स्ट्रिंग में सीधे एम्बेड किया जाता है – अर्थात केवल चर संदर्भ का विस्तार किया जाता है, इसके बावजूद इसके बाद क्या होता है

    • स्ट्रिंग में बाद के अक्षरों से एक वैरिएबल नाम को अलग करने के लिए, इसे { और } में संलग्न } ; उदाहरण के लिए, ${foo}
      यह विशेष रूप से महत्वपूर्ण है यदि चर नाम का पालन किया जाता है : क्योंकि पावरशेल अन्यथा $ और के बीच में सब कुछ माना जाएगा : एक स्कोप विनिर्देशक, आमतौर पर प्रक्षेप को असफल होने के कारण; उदाहरण के लिए, "$HOME: where the heart is." टूटता है, लेकिन "${HOME}: where the heart is." इरादा के रूप में काम करता है
      (वैकल्पिक रूप से, ` -स्पेपः: "$HOME`: where the heart is." )।

    • $ या एक " एक शाब्दिक के रूप में व्यवहार करने के लिए, बचने वाले चारों के साथ उपसर्ग ` (एक बैकटीक ); उदाहरण:
      "`$HOME's value: `"$HOME`""

  • किसी अन्य चीज़ के लिए, "PS version: $($PSVersionTable.PSVersion)" वैरिएबल के गुणों को एक्सेस करने और ऑब्जेक्ट व्हेरिएबल के गुणों को एक्सेस करने सहित, आपको $(...) , उप एक्सपीसियन ऑपरेटर (जैसे "PS version: $($PSVersionTable.PSVersion)" या "1st el.: $($someArray[0])" )

    • $(...) का उपयोग करके आपको डबल-उद्धृत स्ट्रिंग्स में पूरे कमांड लाइन से आउटपुट एम्बेड करने की भी अनुमति मिलती है (उदाहरण के लिए, "Today is $((Get-Date).ToString('d'))."
  • प्रक्षेप के परिणाम मूल रूप से डिफ़ॉल्ट आउटपुट प्रारूप के समान नहीं दिखते (यदि आप वैरिएबल / उप एक्सपैशन को सीधे कंसोल में मुद्रित करते हैं तो आप देखेंगे, उदाहरण के लिए, जिसमें डिफ़ॉल्ट फ़ॉर्मेटर शामिल है, Get-Help about_format.ps1xml )

    • एआरएक्स सहित संग्रह , तत्वों की स्ट्रिंग प्रस्तुतीकरण (डिफ़ॉल्ट रूप से, $OFS सेट करके एक अलग विभाजक निर्दिष्ट किया जा सकता है) के बीच एक स्थान को स्थानांतरित करके तार में कनवर्ट किया जाता है उदा, "array: $(@(1, 2, 3))" पैदावार array: 1 2 3

    • किसी भी अन्य प्रकार के उदाहरण (संग्रहों के तत्वों सहित, जो स्वयं संग्रह नहीं हैं) को IFormattable.ToString() विधि को अपरिवर्तनीय संस्कृति के साथ IFormattable.ToString() जाता है , यदि उदाहरण के प्रकार IFormttable इंटरफ़ेस [1] का समर्थन करता है या कॉलिंग द्वारा .psobject.ToString() , जो ज्यादातर मामलों में बस अंतर्निहित। NET प्रकार के। को .ToString() विधि [2] , जो एक सार्थक प्रतिनिधित्व दे सकती है या नहीं: जब तक कि (गैर-आदिम) प्रकार ने विशेष रूप से ओवरराइड किया है। .ToString() विधि, आपको मिलेगा सभी प्रकार का पूरा नाम (उदाहरण के लिए, "hashtable: $(@{ key = 'value' })" पैदावार hashtable: System.Collections.Hashtablehashtable: System.Collections.Hashtablehashtable: System.Collections.Hashtable )।

    • कंसोल के रूप में एक ही आउटपुट प्राप्त करने के लिए , Out-String लिए एक उप .Trim() और पाइप का उपयोग करें और लागू करें; .Trim() किसी भी अग्रणी और अनुगामी रिक्त पंक्तियों को हटाने के लिए, यदि वांछित; जैसे,
      "hashtable:`n$((@{ key = 'value' } | Out-String).Trim())" उपज:

       hashtable: Name Value ---- ----- key value 

[1] यह शायद आश्चर्यजनक व्यवहार का मतलब है कि, संस्कृतियों के प्रति संवेदनशील प्रतिनिधित्व, $obj.ToString() की सहायता से वर्तमान -कृषि-योग्य प्रतिनिधित्व प्राप्त होता है, जबकि "$obj" (स्ट्रिंग प्रक्षेपण) हमेशा एक संस्कृति-अपरिवर्तनीय परिणाम देता है प्रतिनिधित्व – मेरा यह उत्तर देखें

[2] उल्लेखनीय अपवाद:
स्ट्रिंग एक विस्तार [pscustomobject] परिणामस्वरूप [pscustomobject] जैसी प्रतिनिधित्व के माध्यम से .psobject.ToString() (समझाया गया है ), जबकि कॉलिंग .ToString() सीधे खाली स्ट्रिंग का उत्पादन करती है