আমি কীভাবে পাওয়ারশেলের স্ট্রিং এবং ভেরিয়েবলকে সংযুক্ত করতে পারি?


609

ধরুন আমার কাছে নিম্নলিখিত স্নিপেট রয়েছে:

$assoc = New-Object psobject -Property @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}

Write-host $assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner

আমি এই স্নিপেটটি দেখানোর জন্য আশা করব:

42 - Slim Shady - Eminem

তবে পরিবর্তে এটি দেখায়:

42 + - + Slim Shady + - + Eminem

যা আমাকে মনে করে যে +অপারেটর স্ট্রিং এবং ভেরিয়েবলকে একত্রিত করার জন্য উপযুক্ত নয়।

পাওয়ার শেলের সাথে আপনার কীভাবে এটির যোগাযোগ করা উচিত?


28
আপনার কোডটি যদি সমস্ত উপাদানগুলিতে স্ট্রিং হয় এবং আপনি এক্সপ্রেশনটি বন্ধনীতে আবদ্ধ করেন তবে এটি কাজ করে: Write-host ($assoc.Id.ToString() + " - " + $assoc.Name + " - " + $assoc.Owner) এসোসড Iএইড Int32তাই আমাদের তার স্ট্রিং প্রতিনিধিত্ব ব্যবহার করতে হবে। অন্যথায় পিএস সংমিশ্রণের পরিবর্তে একটি গাণিতিক সংযোজন করার চেষ্টা করে।
বুভিয়ার

5
আমার সম্পাদনাগুলি সামগ্রীতে কিছুটা পরিবর্তন করলেও এই প্রশ্নের পাঠ্য মেরামত করা ভাল বলে মনে হয়েছিল thought প্রশ্নের পরিভাষা / শব্দগোলন এবং স্পিরিটটি অক্ষত রাখার চেষ্টা করেছি, পর্যাপ্ত পরিমাণে উন্নতি করার জন্য যাতে এটি আবার খোলা যায়।
জেরোইন

উত্তর:


666
Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"

দেখুন উইন্ডোজ PowerShell ভাষা নির্দিষ্টকরণ সংস্করণ 3.0 , p34, সাব-এক্সপ্রেশন সম্প্রসারণ।


1
এই কৌশলটি Write-Output এট আল-এর সাথেও কাজ করে, সুতরাং আপনার টুলবক্সে থাকা সম্ভবত এটি সবচেয়ে কার্যকর।
ফেন্টন

4
কেন $ ($ নাম) বনাম মাত্র $ নাম? এটি কি ash {name using ব্যবহার করে ব্যাশের মতো একইভাবে প্রতিরক্ষামূলক?
ড্যানি স্ট্যাপল

73
এটি প্রযুক্তিগতভাবে সংক্ষেপণ নয়।
ট্র্যাভিসিজ

8
@ ড্যানিস্ট্যাপল প্রশ্নটি এতটাই সম্পাদিত হয়েছে যে উত্তরটির আর কোনও অর্থ হয় না। পাতলা ছায়াময় উদাহরণে, হ্যাঁ "... $name ..."সমস্ত একই কাজ করবে তবে মূল প্রশ্নের যেটির জন্য এই উত্তরটি সম্বোধন করা হয়েছে তাতে প্রশ্নটি হল কীভাবে বস্তুর বৈশিষ্ট্য অ্যাক্সেস করবেন। তাই যদি $name.id -eq 42তারপর "... $name.id ..."মত যদি আপনি চান, কারণ এটি মত রেন্ডার হবে কাজ করবে না ... @{id=42}.id ...আকাঙ্ক্ষিত পরিবর্তে ... 42 ...এটার জন্য উত্তর এর পদ্ধতি ব্যবহার "... $($name.id) ..."। আমি পরে সম্পাদনা করতে প্রশ্ন বুকমার্ক করছি।
জেফ পেকেট

3
পাওয়ারশেল ভাষা স্পেসিফিকেশনে আমাকে ইশারা করার জন্য অনেক ধন্যবাদ। শিক্ষানবিস হিসাবে, আমি পাওয়ারশেল কেন কোনও অফিসিয়াল টিউটোরিয়াল নিয়ে আসে না তা সম্পর্কে আমি সর্বদা বিভ্রান্ত হয়ে পড়েছি। এই ভাষাটির বৈশিষ্টটি দেখতে আমি যা খুঁজছি তার মতো দেখাচ্ছে। আবার ধন্যবাদ!
রায়লুও

256

একক এবং ডাবল উদ্ধৃতিগুলির মধ্যে পার্থক্যটি কেউ উল্লেখ করেছেন বলে মনে হয় না। (আমি পাওয়ারশেল 4 ব্যবহার করছি)।

আপনি এটি করতে পারেন (যেমন @ বেন বলেছেন):

$name = 'Slim Shady'
Write-Host 'My name is'$name
-> My name is Slim Shady

অথবা আপনি এটি করতে পারেন:

$name = 'Slim Shady'
Write-Host "My name is $name"
-> My name is Slim Shady

একক উদ্ধৃতি আক্ষরিক জন্য, স্ট্রিং ঠিক এইভাবে আউটপুট, দয়া করে। ডাবল কোটগুলি যখন আপনি কিছু প্রাক প্রক্রিয়াজাতকরণ সম্পন্ন করতে চান (যেমন ভেরিয়েবল, বিশেষ অক্ষর ইত্যাদি)

তাই:

$name = "Marshall Bruce Mathers III"
Write-Host "$name"
-> Marshall Bruce Mathers III

যেখানে:

$name = "Marshall Bruce Mathers III"
Write-Host '$name'
-> $name

( http://ss64.com/ps/syntax-esc.html আমি রেফারেন্সের জন্য ভাল মনে করি)।


1
1.0 সঙ্গে কাজ করে।
স্মিথ জন্থ

134

একটি উপায়:

Write-host "$($assoc.Id)  -  $($assoc.Name)  -  $($assoc.Owner)"

আর একটি হ'ল:

Write-host  ("{0}  -  {1}  -  {2}" -f $assoc.Id,$assoc.Name,$assoc.Owner )

অথবা কেবল (তবে আমি এটি পছন্দ করি না)):

Write-host $assoc.Id  "  -  "   $assoc.Name  "  -  "  $assoc.Owner

7
আমি মনে করি না যে শেষটি আপনার প্রত্যাশা মতো ঠিক কাজ করে। পেস্টবিন দেখুন এখানে । পাওয়ারশেল $assoc.Idএবং "(এট আল) এর মধ্যে শ্বেত স্পেসের জন্য আউটপুটে একটি (যদিও আপনার দুটি এখানে রয়েছে) স্থান যুক্ত করবে । অর্থাত, বিকল্প 1 আপনাকে দেয় Id__-__Name__-__Owner(প্রত্যেকটির প্রতিটি দিকে দুটি স্পেস -), তবে বিকল্প 3 দেয় Id___-___Name___-___Owner( তিনটি স্পেস)।
ruffin

4
সম্ভবত আরও দরকারী পেস্টবিন । ### এর দুপাশে ফাঁকা স্থান যুক্ত $assoc.Id"###"$assoc.Name করবে , যেখানে "$($assoc.Id)###$($assoc.Name)" হবে না
ruffin

1
দ্বিতীয়টি আমাকে বোঝায় যে পাওয়ারশেল আমার উদ্দেশ্যগুলির জন্য আমার যা প্রয়োজন - ধন্যবাদ!
মাভিসিআরটি

123

আপনি ব্যবহার করতে পারেন -join

যেমন

$name = -join("Jo", "h", "n");

"জন" কে $ নামে অর্পণ করবে।

সুতরাং আউটপুট, এক লাইনে:

Write-Host (-join("Jo", "h", "n"))

68

প্রথম বন্ধনীতে যা মুদ্রণ করতে চান তা মোড়ানোর চেষ্টা করুন:

Write-host ($assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner)

আপনার কোডটি অনেকগুলি পরামিতিগুলিতে পাস হচ্ছে বলে ব্যাখ্যা করা হচ্ছে Write-Host। এটি প্রথম বন্ধনীতে আবৃত করা মানগুলি একত্রিত করে এবং তারপরে ফলাফলটি একটি একক প্যারামিটার হিসাবে পাস করবে।


3
+1, ডাবল কোট এবং ভেরিয়েবল মান সহ অন্যান্য পদ্ধতি ব্যবহার করার জন্য Write-Debugবা ব্যবহারের জন্য আমি এই ফর্ম্যাটটি পছন্দ করি Write-Verbose, যেমনWrite-Debug ('Running "cmdlet" with parameter $MyVar = ' + $MyVar + " at time " + (Get-Date -DisplayHint Time))
আইটি বিয়ার

হ্যাঁ, এটি স্ট্রিং কনটেনটেশন। এটি নতুন লাইন বা অতিরিক্ত স্থান যুক্ত করে না। এটি আপনাকে একক বা ডাবল-কোটযুক্ত স্ট্রিং ব্যবহার করতে দেয়।
লেক্সিহানকিন্স 21

এই কৌশলটি সত্যিকারের সংমিশ্রণ এবং আপনি যেমন নেট। মাল্টলাইন এসকিউএল স্টেটমেন্ট করার জন্য খুব ভাল! পাওয়ারশেল কেন ডিফল্টরূপে এটি করে না !?
Brain2000

করার অনেক উপায় আছে। তবে এটি স্ট্রিং কনটেন্টেশন এর আসল উত্তর।
চিংনটচিং

32

আরেকটি বিকল্প হ'ল:

$string = $assoc.ID
$string += " - "
$string += $assoc.Name
$string += " - "
$string += $assoc.Owner
Write-Host $string

"সেরা" পদ্ধতিটি সম্ভবত সিবি প্রস্তাবিত একটি:

Write-host "$($assoc.Id)  -  $($assoc.Name)  -  $($assoc.Owner)"

3
আপনি StringBuilderযদি কনট্যাট-পাগল হয়ে যাচ্ছেন তবে আপনাকে বিকল্পটি যুক্ত করতে হবে । ;।)
রাফিন

2
অবশ্যই কোনও বাহ্যিক ফাইলে কাঙ্ক্ষিত বৈশিষ্ট্যগুলি পাইপ করার একটি উপায় রয়েছে, তারপরে হাইফেনের (?) এর সাথে যোগদানকারী উপাদানগুলির একটি স্ট্রিংয়ে তাদের deserialize করুন
কোড জকি

এর থেকেও খারাপ কোনও কল্পনা করা শক্ত। স্ট্রিংগুলি অপরিবর্তনীয়, সুতরাং প্রকৃতপক্ষে প্রতিটি সংক্ষেপণ ক্রিয়াকলাপটি একটি নতুন স্ট্রিং তৈরি করে, মূলটির অক্ষরগুলি অনুলিপি করে।
wombatonfire

22

সেমিডিলেটটিকে বিভিন্ন পরামিতি হিসাবে বিবেচনা করা বন্ধ করতে আপনার বন্ধনীগুলিতে এক্সপ্রেশনটি স্থাপন করতে হবে:

Write-host ($assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner)

এটি লিখন-ডিবাগের জন্য বাধ্যতামূলক
ফ্র্যাঙ্ক

19

প্রকাশের সময়:

"string1" + "string2" + "string3"

স্ট্রিংগুলি একত্রিত করবে। পাওয়ারশেল কমান্ডে পাস করার সময় আপনাকে একটি যুক্তি হিসাবে মূল্যায়ন করতে প্যারেন্যাসিসের সামনে একটি put রাখা দরকার। উদাহরণ:

Write-Host $( "string1" + "string2" + "string3" ) 

বোনাস হিসাবে, আপনি যদি এটি একাধিক লাইন বিস্তৃত করতে চান, তবে আপনাকে রেখার শেষে (ব্যাকটিকের ডানদিকে কোনও স্পেস বা অক্ষর ছাড়াই) আক্কওয়ার্ড ব্যাকটিক সিনট্যাক্স ব্যবহার করতে হবে। উদাহরণ:

Write-Host $(`
    "The rain in "        +`
    "Spain falls mainly " +`
    "in the plains"       )`
    -ForegroundColor Yellow

(প্রকৃতপক্ষে, আমি মনে করি পাওয়ারশেলটি বর্তমানে সামান্য কিছুটা ভুল প্রয়োগ করা হয়েছে যার মাধ্যমে প্রথম বন্ধনীগুলির মধ্যে অপ্রয়োজনীয় ব্যাক-টিকগুলি প্রয়োজন। বন্ধনী সমাপ্তির পরে তারা লাইন ধারাবাহিকতা এবং স্ট্রিংগুলির একত্রীকরণ সম্পর্কিত পাওয়ারশেল সম্পর্কে লোকেদের পছন্দ না করে এমন বেশিরভাগ সমস্যার সমাধান করবে I've আমি খুঁজে পেয়েছি যে আপনি প্রথম বারের বন্ধুত্বের মধ্যে লাইনের ধারাবাহিকতায় ব্যাক-টিকগুলি ছেড়ে দিতে পারেন তবে এটির সত্যিই ফ্লেকি এবং অপ্রত্যাশিত যদি এটি কাজ করবে .. কেবল ব্যাকটিকগুলি যুক্ত করা ভাল)



9

আমি শুধু অন্য উপায় ব্যবহার করে এই কাজ করতে আনতে চান .NET String.Format :

$name = "Slim Shady"
Write-Host ([string]::Format("My name is {0}", $name))

2
String.Formatপুরানো প্লেইনের পরিবর্তে। নেট ব্যবহারের কোনও সুবিধা আছে কি "{0}" -f $var? আমি নেট নেটওয়ার্ক ব্যবহারের বিন্দুটি দেখতে পাচ্ছি না যেখানে প্লেইন পাওয়ারশেল কাজটি করতে পারে ...
ডাইনী

4
@DineiRockenbach সম্ভবত না। শুধু একটি অন্য উদাহরণ আনতে চেয়েছিলেন।
মার্টিন ব্র্যান্ডল 15

9

(বর্তমান PS সংস্করণ 5.1.17134.407)

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

$myVar = "Hello"

echo "${myVar} World"

দ্রষ্টব্য: এটি কেবল ডাবল উদ্ধৃতি দিয়ে কাজ করে


7

এই উত্তরগুলি খুব জটিল বলে মনে হচ্ছে। আপনি যদি এটি পাওয়ারশেল স্ক্রিপ্টে ব্যবহার করে থাকেন তবে আপনি কেবল এটি করতে পারেন:

$name = 'Slim Shady'
Write-Host 'My name is'$name

এটি আউটপুট হবে

আমার নাম স্লিম শ্যাডি

আপনার জন্য শব্দগুলির মধ্যে কীভাবে একটি স্থান স্থাপন করা হয়েছে তা নোট করুন



6

ডস দিনের মতো কনকনিয়েট স্ট্রিংগুলি। লগিংয়ের জন্য এটি একটি বড় চুক্তি তাই আপনি এখানে যান:

$strDate = Get-Date
$strday = "$($strDate.Year)$($strDate.Month)$($strDate.Day)"

Write-Output "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output $strday

6

আমি যখনই পাওয়ারশেলটি এর থেকে দূরে দূরে ব্যবহার করি তখনই আমি এই (এবং আরও অনেক অপ্রয়োজনীয় জিনিস) এর সাথে লড়াই করে যাচ্ছি বলে আমি এখন বেছে নিলাম:

[string]::Concat("There are ", $count, " items in the list")

1
এটি System.Object, fyi প্রদান করে।
ব্যারি


2
$assoc = @{
    Id = 34
    FirstName = "John"
    LastName = "Doe"
    Owner = "Wife"
}

$assocId = $assoc.Id
$assocFN = $assoc.FirstName
$assocLN = $assoc.LastName
$assocName = $assocFN, $assocLN -Join " "
$assocOwner = $assoc.Owner

$assocJoin = $assocId, $assocName, $assocOwner -join " - "
$assocJoin
#Output = 34 - John Doe - Wife

2

আপনি যদি ফাইল পাথ তৈরির জন্য স্ট্রিংগুলি সংঘবদ্ধ করে থাকেন তবে জয়-পাথ কমান্ডটি ব্যবহার করুন:

join-path C:\temp "MyNewFolder"

এটি স্বয়ংক্রিয়ভাবে আপনার জন্য উপযুক্ত পিছনে / শীর্ষস্থানীয় স্ল্যাশ যুক্ত করবে, যা জিনিসগুলি অনেক সহজ করে তোলে।

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


0

আপনি সি # /। নেট পদ্ধতিতেও অ্যাক্সেস পেতে পারেন এবং নিম্নলিখিতগুলিও কাজ করে:

$string1 = "Slim Shady, "
$string2 = "The real slim shady"

$concatString = [System.String]::Concat($string1, $string2)

Output:

Slim Shady, The real slim shady

-2

শুধু মজা করার জন্য। আপনি নীচের মতো পিএসওজেক্টের মানগুলিও অ্যাক্সেস করতে পারেন:

$assoc.psobject.Properties.value -join " - "

তবে যদি আপনি নির্দিষ্ট না করে অবজেক্টটি অর্ডার করা উচিত, পাওয়ারশেল মানগুলি একটি এলোমেলো ক্রমে প্রদর্শন করবে। সুতরাং পতাকা যোগ করা উচিত [আদেশ]

$assoc = [pscustomobject] [ordered] @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.