আপনি কীভাবে কোনও দ্বিগুণ উদ্ধৃত স্ট্রিংয়ে কোনও সামগ্রীর সম্পত্তি ব্যবহার করতে পারেন?


101

আমার কাছে নিম্নলিখিত কোড রয়েছে:

$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চেয়ে মানটির ব্যবহার করার চেষ্টা করে $DatabaseSettings[0].DatabaseNameযা বৈধ নয়।
আমার কাজের দিক থেকে এটি একটি নতুন ভেরিয়েবলে অনুলিপি করা উচিত।

আমি কীভাবে সরাসরি ডাবল-কোটেড স্ট্রিংয়ে অবজেক্টের সম্পত্তি অ্যাক্সেস করতে পারি?

উত্তর:


170

আপনি যখন কোনও ভেরিয়েবলের নাম ডাবল-কোটেড স্ট্রিংয়ে আবদ্ধ করেন তখন এটি সেই ভেরিয়েবলের মান দ্বারা প্রতিস্থাপিত হবে:

$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"

পাওয়ারশেল কেবলমাত্র সে ক্ষেত্রে ভেরিয়েবলগুলি প্রসারিত করে, এর চেয়ে বেশি কিছুই নয়। সূচক, বৈশিষ্ট্য বা এমনকি সম্পূর্ণ গণনা সহ আরও জটিল এক্সপ্রেশনগুলির মূল্যায়ন করার জন্য, আপনাকে subexpression অপারেটরের মধ্যে এমনগুলি আবদ্ধ $( )করতে হবে যা অভ্যন্তরের অভিব্যক্তিটিকে স্ট্রিংয়ের মধ্যে মূল্যায়িত ও এম্বেড করার কারণ করে।


এটি কাজ করে তবে আমি আশ্চর্য হয়েছি যে আমি প্রথম স্থানে এড়াতে চাইলে আমি কেবল স্ট্রিংটকে
সংহত করতে পারি

4
@ ozzy432836 আপনি অবশ্যই পারেন। অথবা বিন্যাস স্ট্রিং ব্যবহার করুন। এটি সাধারণত সত্যই গুরুত্বপূর্ণ নয় এবং ব্যক্তিগত পছন্দের দিকে নেমে আসে।
জোয়

15

@ জোয়ের সঠিক উত্তর রয়েছে তবে আপনাকে কেন মূল্যায়নটি বাধ্য করতে হবে তা নিয়ে আরও কিছু যুক্ত করার জন্য $():

আপনার উদাহরণ কোডটিতে একটি অস্পষ্টতা রয়েছে যা নির্দেশ করে যে পাওয়ারশেলের নির্মাতারা কেন কেবলমাত্র পরিবর্তনশীল রেফারেন্সগুলিতে সম্প্রসারণকে সীমাবদ্ধ করতে এবং সেইসাথে বৈশিষ্ট্যগুলিতে অ্যাক্সেস সমর্থন না করার জন্য বেছে নিয়েছেন (আলাদাভাবে: স্ট্রিং সম্প্রসারণটি ToString()বস্তুটিতে পদ্ধতিটি কল করেই করা হয়, যা কিছু "বিজোড়" ফলাফল ব্যাখ্যা করতে পারে)।

আপনার উদাহরণটি কমান্ড লাইনের একেবারে শেষে রয়েছে:

...\$LogFileName.ldf

যদি অবজেক্টের বৈশিষ্ট্যগুলি ডিফল্টরূপে প্রসারিত হয় তবে উপরেরটি এটি সমাধান করবে

...\

যেহেতু রেফারেন্স করা অবজেক্টটির $LogFileNameকোনও নামক সম্পত্তি থাকবে না ldf, $null(বা একটি খালি স্ট্রিং) পরিবর্তনশীল হিসাবে প্রতিস্থাপন করা হবে।


4
ভাল লাগছে। আমি আসলে তার সমস্যাটি কী তা সম্পূর্ণরূপে নিশ্চিত ছিলাম না তবে একটি স্ট্রিংয়ের মধ্যে থেকে দুর্গন্ধযুক্ত গন্ধ থেকে বৈশিষ্ট্যগুলি অ্যাক্সেস করার চেষ্টা করছিলাম :)
জয়ে

ধন্যবাদ বন্ধুরা! জোহনেস আপনি কেন মনে করেন যে স্ট্রিংয়ের বৈশিষ্ট্যগুলিতে অ্যাক্সেস করা খারাপ গন্ধযুক্ত? এটি কীভাবে করা উচিত?
ক্যাভম্যান_ডিক

ক্যাভম্যান: এটি কেবল এমন একটি বিষয় যা আমার চোখটিকে একটি সম্ভাব্য ত্রুটির কারণ হিসাবে ধরা দিয়েছে। আপনি অবশ্যই এটি করতে পারেন এবং এটি অদ্ভুত কিছু নয় তবে $ () অপারেটরটি বাদ দেওয়ার সময় এটি "ব্যর্থ" বলে চিৎকার করে কারণ এটি কাজ করতে পারে না। সুতরাং আমার উত্তরটি হ'ল আপনার সমস্যাটি কী হতে পারে সে সম্পর্কে একটি শিক্ষিত অনুমান, প্রথম সম্ভাব্য ব্যর্থতার কারণটি আমি দেখতে পেলাম using দুঃখিতটি যদি এটির মতো দেখায় তবে এই মন্তব্যটি কোনও সেরা অনুশীলন বা এমনটি উল্লেখ করে নি।
জো 13

ভাল আপনি আমাকে সেখানে উদ্বিগ্ন ছিল! ;) আমি যখন প্রথম পাওয়ারশেলটি ব্যবহার শুরু করি তখন আমি ভেবেছিলাম যে স্ট্রিংয়ের পরিবর্তনশীলটি কিছুটা অদ্ভুত, তবে এটি বেশ সহজ। আমি ঠিক এমন একটি নির্দিষ্ট জায়গা সন্ধান করতে পারি নি যে আমি সিনট্যাক্স সাহায্যের সন্ধান করতে পারি।
ক্যাভম্যান_ডিক 14

9

@ জোয়ের একটি ভাল উত্তর আছে। আরও একটি সাথে আরও একটি উপায় আছে। নেট স্ট্রিংয়ের সাথে দেখুন mat ফর্ম্যাট সমতুল্য, বস্তুগুলিতে বৈশিষ্ট্য অ্যাক্সেস করার সময় আমি এটিকে পছন্দ করি:

একটি গাড়ী সম্পর্কে জিনিস:

$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

হ্যাঁ এটি আরও পঠনযোগ্য বিশেষত আপনি যদি নেট কোড ব্যবহার করেন। ধন্যবাদ! :)
ক্যাভম্যান_ডিক

4
আপনি যখন প্রথম ফর্ম্যাট স্ট্রিং ব্যবহার করেন তখন সন্ধান করার জন্য একটি গ্যাচা রয়েছে যা হ'ল আপনাকে প্রায়শই পেরেন্সে প্রকাশটি বন্ধ করতে হবে। আপনি উদাহরণস্বরূপ লিখতে পারবেন না write-host "foo = {0}" -f $fooযেহেতু পাওয়ারশেল প্যারামিটার -fহিসাবে বিবেচনা করবে । এই উদাহরণে আপনার প্রয়োজন হবে । এটি স্ট্যান্ডার্ড পাওয়ারশেলের আচরণ, তবে লক্ষণীয়। ForegroundColorwrite-hostwrite-host ( "foo = {0}" -f $foo )
andyb

কেবলমাত্র পেডেন্টিক হতে, উপরের উদাহরণটি "স্ট্রিং ইন্টারপোলেশন" নয়, এটি "সম্মিলিত বিন্যাস"। যেহেতু পাওয়ারশেল অবিচ্ছিন্নভাবে .NET এর সাথে আবদ্ধ, যার জন্য সি # এবং ভিবি.এনইটি প্রাথমিক প্রোগ্রামিং ভাষা, তাই "স্ট্রিং ইন্টারপোলেশন" এবং "ইন্টারপোল্টেড স্ট্রিং" (এবং অনুরূপ কিছু) শব্দগুলি কেবলমাত্র সেই নতুন $ প্রিপেন্ডেড স্ট্রিংগুলিতে পাওয়া উচিত যা এইগুলিতে পাওয়া যায় ভাষা (সি # 6 এবং ভিবি। নেট 14)। এই স্ট্রিংগুলিতে, প্যারামিটারের এক্সপ্রেশনগুলি সংখ্যার প্যারামিটার রেফারেন্সগুলির পরিবর্তে স্ট্রিংয়ে এম্বেড করা হয়, আসল এক্সপ্রেশনগুলি তারপরে যুক্তিযুক্ত হয়ে থাকে String.Format
উবার ক্লুগার

@ আন্ডিয়াব, "গোটচাস" ফরম্যাটের স্ট্রিং সম্পর্কিত। এটি আসলে এক্সপ্রেশন এবং আর্গুমেন্ট মোডের মধ্যে পার্থক্য ( প্রায়_ পার্সিং দেখুন )। কমান্ডগুলি টোকেনগুলিতে পার্স করা হয় (অক্ষরের গ্রুপগুলি একটি অর্থপূর্ণ স্ট্রিং গঠন করে)। স্থানটি টোকেনগুলি পৃথক করে যা একীভূত হবে তবে অন্যথায় উপেক্ষা করা হবে। কমান্ডের প্রথম টোকেনটি যদি একটি সংখ্যা, পরিবর্তনশীল, স্টেটমেন্ট কীওয়ার্ড (যদি, যখন, ইত্যাদি), অ্যানারি অপারেটর, {, ইত্যাদি ... তবে পার্সিং মোড Expressionঅন্যথায় Argument(কমান্ড টার্মিনেটর অবধি) হয়।
উবার ক্লুগার

9

ডকুমেন্টেশন নোট: Get-Help about_Quoting_Rulesস্ট্রিং ইন্টারপোলেশন কভার করে, তবে, পিএসভি 5 হিসাবে, গভীরতায় নয়।

পূরক জোয়ি এর সহায়ক উত্তর একটি সঙ্গে রাষ্ট্রীয় সারসংক্ষেপ PowerShell এর স্ট্রিং সম্প্রসারণ (ইন স্ট্রিং ক্ষেপক ডাবল উদ্ধৃত স্ট্রিং ( "...", ওরফে বিস্তারযোগ্য স্ট্রিং ), ডাবল উদ্ধৃত সহ এখানে-স্ট্রিং ):

  • শুধুমাত্র যেমন রেফারেন্স $foo, $global:foo(অথবা $script:foo, ...) এবং$env:PATH (এনভায়রনমেন্ট ভেরিয়েবল) যখন স্বীকৃত হয় সরাসরি একটি এমবেড "..."স্ট্রিং - যে, শুধুমাত্র পরিবর্তনশীল রেফারেন্স নিজেই প্রসারিত হয়, নির্বিশেষে কি অনুসরণ করে এমন ব্যাক্তিদের।

    • করার একটি পরিবর্তনশীল নাম দুর্বোধ্য স্ট্রিং পরবর্তী অক্ষর থেকে এটা ঘিরা {এবং} ; যেমন ${foo},।
      এই যদি পরিবর্তনশীল নাম দ্বারা অনুসরণ করা হয় বিশেষভাবে গুরুত্বপূর্ণ :, যেমন PowerShell অন্যথায় মধ্যবর্তী সবকিছুর বিবেচনা করবে $এবং :একটি সুযোগ সাধারণত করার ক্ষেপক ঘটাচ্ছে নির্দিষ্টকারী ব্যর্থ ; যেমন "$HOME: where the heart is."বিরতি, তবে "${HOME}: where the heart is."উদ্দেশ্য হিসাবে কাজ করে।
      (অথবা, `-escape :: "$HOME`: where the heart is.")।

    • আক্ষরিক হিসাবে একটি $বা একটি "হিসাবে চিকিত্সা করতে , এড়িয়ে চলার চর দিয়ে এটি উপস্থাপন করুন (একটি ব্যাকটিক ); যেমন:`
      "`$HOME's value: `"$HOME`""

  • অন্য কিছু ব্যবহার সহ অ্যারে সাবস্ক্রিপ্টগুলোর এবং একটি বস্তু পরিবর্তনশীল এর অ্যাক্সেস বৈশিষ্ট্য , আপনাকে অবশ্যই মত প্রকাশের ঘিরা$(...) , subexpression অপারেটর (যেমন, "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

    • এর দৃষ্টান্ত অন্য কোনো ধরনের (যে নিজেদের সংগ্রহের নয় সংগ্রহের উপাদান সহ) হয় দ্বারা stringified পারেন কলিং IFormattable.ToString()সঙ্গে পদ্ধতি পরিবর্তিত সংস্কৃতি , উদাহরণস্বরূপ ধরন সমর্থন করে IFormattableইন্টারফেস [1] , বা কল করে .psobject.ToString(), যা অধিকাংশ ক্ষেত্রে কেবল পূজা অন্তর্নিহিত। নেট প্রকারের .ToString()পদ্ধতি [২] , যা অর্থবহ উপস্থাপনা দিতে পারে বা নাও পারে: যদি না (অ-আদিম) প্রকারটি নির্দিষ্টভাবে .ToString()পদ্ধতিটিকে ওভাররাইড না করে , তবে আপনার সমস্ত কিছুই পুরো টাইপের নাম (যেমন, "hashtable: $(@{ key = 'value' })"ফলন hashtable: System.Collections.Hashtable))

    • করতে কনসোলে হিসাবে একই আউটপুট পেতে , একটি subexpression এবং ব্যবহার করার জন্য পাইপOut-String এবং প্রয়োগ .Trim(), কোনো সামনের এবং পিছনের খালি লাইন মুছে ফেলার জন্য ইচ্ছা হলে; যেমন,
      "hashtable:`n$((@{ key = 'value' } | Out-String).Trim())"ফলন:

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

[1] এই সম্ভবত বিস্ময়কর আচরণ মানে যে ধরনের জন্য যে সমর্থন সংস্কৃতি সংবেদনশীল উপস্থাপনা, $obj.ToString()একটি উৎপাদ বর্তমান -culture-উপযুক্ত উপস্থাপনা, যেহেতু "$obj"(STRING ক্ষেপক) সবসময় একটি ফলাফল সংস্কৃতি-পরিবর্তিত উপস্থাপনা - দেখুন এই উত্তর

[2] উল্লেখযোগ্য ওভাররাইডগুলি:

  • এর পূর্বে আলোচনা stringification সংগ্রহের (বদলে ভালো কিছু উপাদানের স্থান পৃথক করা তালিকা System.Object[])।
  • হ্যাশটেবল- যেমন খালি স্ট্রিংয়ের চেয়ে [pscustomobject]উদাহরণগুলির প্রতিনিধিত্ব ( এখানে ব্যাখ্যা করা হয়েছে ) ।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.