ฉันจะแปลงวัตถุอาร์เรย์เป็นสตริงใน PowerShell ได้อย่างไร


175

ฉันจะแปลงวัตถุอาร์เรย์เป็นสตริงได้อย่างไร

ฉันเหนื่อย:

$a = "This", "Is", "a", "cat"
[system.String]::Join(" ", $a)

โชคไม่ ความเป็นไปได้ที่แตกต่างกันใน PowerShell คืออะไร


5
ดูคำตอบของฉัน แต่รหัสของคุณก็ใช้ได้เช่นกัน ทำไมคุณถึงพูดว่า "ไม่มีโชค"
Roman Kuzmin

4
ขออภัยดูเหมือนว่าจะใช้งานได้ฉันคิดว่าฉันทำสิ่งที่ผิดพลาดเมื่อฉันทดสอบสิ่งนี้
jrara

คำตอบ:


294
$a = 'This', 'Is', 'a', 'cat'

ใช้เครื่องหมายคำพูดคู่ (และใช้ตัวคั่น$ofs)

# This Is a cat
"$a"

# This-Is-a-cat
$ofs = '-' # after this all casts work this way until $ofs changes!
"$a"

ใช้ประกอบการเข้าร่วม

# This-Is-a-cat
$a -join '-'

# ThisIsacat
-join $a

ใช้การแปลงเป็น [string]

# This Is a cat
[string]$a

# This-Is-a-cat
$ofs = '-'
[string]$a

9
สำหรับคนที่ยังไม่ได้เริ่มต้น (อย่างฉัน) $ofsมีเอกสารไว้ที่นี่
เลียม

13
Stackoverflow Documentation ปิดตัวลงดังนั้นลิงก์ของ Liam จึงตาย นี่คือคำอธิบายของ $ OFS อีกตัวแยกฟิลด์ผลลัพธ์: blogs.msdn.microsoft.com/powershell/2006/07/15/…
Simon Tewsi

ทำไมถึงเรียกว่า OFS มันเป็นชื่อแปลก ๆ ที่ถูกเรียกว่า IFS บนเชลล์มาตรฐานมานานหลายทศวรรษและหลายสิบปี
Johan Boulé

1
@ JohanBoulé: เนื่องจากการใช้อักขระตัวแรกของตัวคั่นฟิลด์อินพุตเป็นตัวแยกฟิลด์เอาต์พุตเป็นแฮ็คที่น่ารังเกียจ - และไม่อนุญาตให้แยกฟิลด์ด้วยสตริงอักขระหลายตัว (Awk เช่นมีตัวแปร FS และ OFS)
Martin Bonner สนับสนุน Monica

@martin bonner: ขอบคุณมันสมเหตุสมผลแล้ว ฉันไม่รู้ว่าฉันทำสิ่งนี้ผิด
Johan Boulé

36

ฉันพบว่าการไพเรย์ไปยังOut-Stringcmdlet นั้นทำงานได้ดีเช่นกัน

ตัวอย่างเช่น:

PS C:\> $a  | out-string

This
Is
a
cat

ขึ้นอยู่กับเป้าหมายสุดท้ายของคุณว่าจะใช้วิธีใดดีที่สุด


4
FYI: การทำเช่น$aนั้นจะมีผลเช่นเดียวกับ$a | out-string
JohnLBevan

7
@JohnLBevan ไม่เสมอไป ($a | out-string).getType()= สตริง $a.getType()= วัตถุ [] หากคุณใช้ $ a เป็นอาร์กิวเมนต์สำหรับวิธีที่คาดหวังสตริง (เช่นinvoke-expressionตัวอย่าง) แสดงว่า$a | out-stringมีข้อได้เปรียบที่ชัดเจน
rojo

18
1> $a = "This", "Is", "a", "cat"

2> [system.String]::Join(" ", $a)

บรรทัดสองทำการดำเนินการและส่งออกไปยังโฮสต์ แต่ไม่แก้ไข $ a:

3> $a = [system.String]::Join(" ", $a)

4> $a

This Is a cat

5> $a.Count

1

10

จากท่อ

# This Is a cat
'This', 'Is', 'a', 'cat' | & {"$input"}

# This-Is-a-cat
'This', 'Is', 'a', 'cat' | & {$ofs='-';"$input"}

เขียนเป็นเจ้าภาพ

# This Is a cat
Write-Host 'This', 'Is', 'a', 'cat'

# This-Is-a-cat
Write-Host -Separator '-' 'This', 'Is', 'a', 'cat'

ตัวอย่าง


นี่เป็นเคล็ดลับที่น่าทึ่ง ตัวอย่างไม่ทำงานอีกต่อไปและแม้ว่าคำตอบนี้จะมีอายุ 5 ปีฉันพยายามอธิบายสิ่งที่เรียนรู้วันนี้ $ofsเป็นOutput Field Separatorตัวแปรที่จะใช้เมื่ออาร์เรย์จะถูกแปลงเป็นสตริงสำหรับการส่งออก นี่มันตั้งอยู่ในค่าสตริงสคริปต์บล็อกกลับมาของอินพุต (อาร์เรย์จากท่อ) &ที่ได้รับการดำเนินการโดยคำสั่ง ฉันไม่เคยรู้จัก$ofsมาก่อนรวมทั้ง&ยอมรับการบล็อกสคริปต์เป็นอาร์กิวเมนต์
Martin Konopka

3

คุณสามารถระบุประเภทดังนี้:

[string[]] $a = "This", "Is", "a", "cat"

ตรวจสอบประเภท:

$a.GetType()

ยืนยัน:

    IsPublic IsSerial ชื่อ BaseType
    -------- -------- ---- --------
    True True String [] System.Array

กำลังส่งออก $ a:

PS C: \> $ a 
นี้ 
คือ 

แมว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.