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




string-interpolation (3)

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

$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[0].DatabaseName के मूल्य का उपयोग करने का प्रयास करता है। $DatabaseSettings[0].DatabaseName , जो मान्य नहीं है।
मेरा कामकाज यह एक नए चर में कॉपी किया गया है।

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


@ जॉय का अच्छा जवाब है। 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

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

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

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

...\$LogFileName.ldf

यदि वस्तुओं के गुण डिफ़ॉल्ट रूप से विस्तारित किए गए थे, तो उपर्युक्त हल हो जाएगा

...\

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


दस्तावेज़ीकरण नोट: स्ट्रिंग इंटरपोलेशन के बारे Get-Help about_Quoting_Rules , लेकिन, पीएसवी 5 के रूप में, गहराई से नहीं।

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

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

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

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

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

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

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

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

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

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

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

[2] उल्लेखनीय ओवरराइड:
* संग्रहों की पहले चर्चा की गई स्ट्रिंगिफिकेशन ( System.Object[] जैसी चीज़ों की बजाय तत्वों की स्पेस-पृथक सूची)।
* [pscustomobject] जैसे खाली स्ट्रिंग की बजाय [pscustomobject] उदाहरणों ( here समझाया here ) का प्रतिनिधित्व।





string-interpolation