Misalkan saya memiliki cuplikan berikut:
$assoc = New-Object psobject -Property @{
Id = 42
Name = "Slim Shady"
Owner = "Eminem"
}
Write-host $assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner
Saya berharap cuplikan ini ditampilkan:
42 - Slim Shady - Eminem
Tapi itu justru menunjukkan:
42 + - + Slim Shady + - + Eminem
Yang membuat saya berpikir +
operator tidak cocok untuk menggabungkan string dan variabel.
Bagaimana Anda harus mendekati ini dengan PowerShell?
powershell
string-concatenation
Ninja Cowgirl
sumber
sumber
Write-host ($assoc.Id.ToString() + " - " + $assoc.Name + " - " + $assoc.Owner)
sini $ assoc.Id adalahInt32
jadi kita harus menggunakan representasi string-nya. Kalau tidak, PS mencoba melakukan penambahan aritmatika alih-alih rangkaian.Jawaban:
Lihat Spesifikasi sub-ekspresi Windows PowerShell Language Spesifikasi Versi 3.0 , p34,.
sumber
Write-Output
et al , jadi mungkin ini yang paling berguna untuk dimiliki di kotak peralatan Anda."... $name ..."
akan bekerja semua sama, tetapi dalam pertanyaan asli yang dijawab jawaban ini, pertanyaannya adalah bagaimana mengakses properti objek. jadi jika$name.id -eq 42
kemudian"... $name.id ..."
tidak akan berfungsi seperti yang Anda inginkan karena itu akan membuat suka... @{id=42}.id ...
daripada yang diinginkan... 42 ...
Untuk itu, gunakan metode jawabannya"... $($name.id) ..."
. Saya mem-bookmark pertanyaan untuk diedit nanti.Tampaknya tidak ada yang menyebutkan perbedaan antara tanda kutip tunggal dan ganda. (Saya menggunakan PowerShell 4).
Anda dapat melakukan ini (seperti yang dikatakan @Ben):
Atau Anda dapat melakukan ini:
Kutipan tunggal untuk literal, tolong berikan string persis seperti ini. Kutipan ganda untuk ketika Anda ingin beberapa pra-pemrosesan dilakukan (seperti variabel, karakter khusus dll)
Begitu:
Sedangkan:
( http://ss64.com/ps/syntax-esc.html Saya menemukan referensi yang bagus).
sumber
Salah satu caranya adalah:
Yang lain adalah:
Atau hanya (tapi saya tidak suka;)):
sumber
$assoc.Id
dan"
(et al). Artinya, opsi 1 memberi AndaId__-__Name__-__Owner
(dua spasi di setiap sisi masing-masing-
), tetapi opsi 3 memberiId___-___Name___-___Owner
( tiga spasi).$assoc.Id"###"$assoc.Name
akan menambah spasi di kedua sisi ###, di mana"$($assoc.Id)###$($assoc.Name)"
tidak .Anda juga bisa menggunakan
-join
Misalnya
Akan menetapkan "John" ke $ name.
Jadi untuk output, dalam satu baris:
sumber
Cobalah membungkus apa pun yang ingin Anda cetak dalam tanda kurung:
Kode Anda sedang ditafsirkan sebagai banyak parameter yang diteruskan ke
Write-Host
. Membungkusnya di dalam tanda kurung akan menggabungkan nilai-nilai dan kemudian meneruskan nilai yang dihasilkan sebagai parameter tunggal.sumber
Write-Debug
atauWrite-Verbose
untuk menyertakan tanda kutip ganda dan nilai variabel, sepertiWrite-Debug ('Running "cmdlet" with parameter $MyVar = ' + $MyVar + " at time " + (Get-Date -DisplayHint Time))
Pilihan lain adalah:
Metode "terbaik" mungkin yang disarankan CB:
sumber
StringBuilder
opsi jika Anda gila gila. ; ^)Anda perlu menempatkan ekspresi dalam tanda kurung untuk menghentikannya diperlakukan sebagai parameter berbeda ke cmdlet:
sumber
Sementara ekspresi:
akan menyatukan senar. Anda harus meletakkan $ di depan tanda kurung untuk membuatnya mengevaluasi sebagai argumen tunggal ketika diteruskan ke perintah PowerShell. Contoh:
Sebagai bonus, jika Anda ingin span beberapa baris, maka Anda perlu menggunakan sintaks backtick ackward di akhir baris (tanpa spasi atau karakter di sebelah kanan backtick). Contoh:
(Sebenarnya, saya pikir Powershell saat ini diimplementasikan sedikit salah dengan memerlukan back-ticks yang tidak perlu di antara tanda kurung. Jika Microsoft hanya akan mengikuti aturan Parenthesis "Python" atau "TCL" yang memungkinkan Anda untuk menempatkan baris baru sebanyak yang Anda inginkan antara mulai dan mengakhiri kurung maka mereka akan memecahkan sebagian besar masalah yang orang tidak suka tentang PowerShell terkait dengan kelanjutan garis, dan rangkaian string. Saya telah menemukan bahwa Anda dapat meninggalkan tanda centang-off kadang-kadang pada kelanjutan garis antara tanda kurung, tetapi itu benar-benar flakey dan tidak dapat diprediksi jika akan bekerja .. lebih baik hanya menambahkan backticks.)
sumber
Berikut ini cara lain sebagai alternatif:
sumber
Saya hanya ingin membawa cara lain untuk melakukan ini menggunakan .NET String.Format :
sumber
String.Format
daripada yang lama"{0}" -f $var
? Saya tidak melihat gunanya menggunakan kode .NET di mana PowerShell biasa dapat melakukan pekerjaan ...(Versi PS saat ini 5.1.17134.407)
Semuanya dikatakan dan dilakukan sekarang, saya rasa tetapi ini juga berfungsi seperti sekarang:
Catatan: ini hanya bekerja dengan tanda kutip ganda
sumber
Semua jawaban ini tampaknya sangat rumit. Jika Anda menggunakan ini dalam skrip PowerShell Anda bisa melakukan ini:
Ini akan menampilkan
Perhatikan bagaimana spasi diletakkan di antara kata-kata untuk Anda
sumber
Dari Apa yang Harus Dilakukan / Tidak Dilakukan di PowerShell: Bagian 1 :
sumber
String gabungan seperti di hari-hari DOS. Ini adalah masalah besar untuk penebangan jadi di sini Anda mulai:
sumber
toString
pilihannya lebih mudah:(Get-Date).toString('yyyyMMdd')
Saya sepertinya bergumul dengan ini (dan banyak hal tidak intuitif lainnya) setiap kali saya menggunakan PowerShell dari waktu ke waktu, jadi saya sekarang memilih:
sumber
Write-Host dapat digabungkan seperti ini juga:
Ini adalah cara paling sederhana, IMHO.
sumber
sumber
Jika Anda menggabungkan string untuk membangun path file, gunakan perintah join-path:
Ini akan secara otomatis menambahkan garis miring / garis miring yang sesuai untuk Anda, yang membuat segalanya jauh lebih mudah.
Saya minta maaf jika ini terlalu di luar topik, tetapi saya pikir ini mungkin bisa membantu.
Jika saya tidak menggunakan PowerShell untuk sementara waktu, kadang-kadang saya akan lupa itu ada dan mulai mencari operator gabungan.
sumber
Anda juga bisa mendapatkan akses ke metode C # /. NET, dan yang berikut ini juga berfungsi:
sumber
Hanya untuk bersenang-senang. Anda juga dapat mengakses nilai-nilai PSObject secara langsung seperti di bawah ini:
Tetapi jika Anda tidak menentukan bahwa objek harus dipesan, Powershell akan menampilkan nilai-nilai dalam urutan acak. Jadi sebaiknya tambahkan flag [dipesan]
sumber