Làm cách nào để chuyển đổi một đối tượng mảng thành một chuỗi trong PowerShell?


175

Làm thế nào tôi có thể chuyển đổi một đối tượng mảng thành chuỗi?

Tôi đã thử:

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

không có may mắn . Các khả năng khác nhau trong PowerShell là gì?


5
Xem câu trả lời của tôi nhưng mã của bạn cũng hoạt động tốt. Tại sao bạn nói "không có may mắn"?
Roman Kuzmin

4
Xin lỗi, vâng, nó dường như hoạt động, tôi nghĩ rằng tôi đã làm hỏng một cái gì đó khi tôi thử nghiệm điều này.
jrara

Câu trả lời:


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

Sử dụng dấu ngoặc kép (và tùy chọn sử dụng dấu phân cách $ofs)

# This Is a cat
"$a"

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

Sử dụng toán tử tham gia

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

# ThisIsacat
-join $a

Sử dụng chuyển đổi sang [string]

# This Is a cat
[string]$a

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

9
Đối với người chưa bắt đầu (như tôi) $ofsđược ghi lại ở đây
Liam

13
Tài liệu Stackoverflow đã bị tắt nên liên kết của Liam đã chết. Dưới đây là một lời giải thích của $ OFS, Trường Xuất Separator: blogs.msdn.microsoft.com/powershell/2006/07/15/...
Simon Tewsi

Tại sao lại gọi là OFS? Đó là một cái tên kỳ lạ khi được gọi là IFS trên vỏ tiêu chuẩn trong nhiều thập kỷ và nhiều thập kỷ.
Johan Boulé

1
@ JohanBoulé: Bởi vì sử dụng ký tự đầu tiên của Dấu tách trường đầu vào làm Dấu tách trường đầu ra là một hack khó chịu - và không cho phép tách các trường bằng các chuỗi nhiều ký tự. (Ví dụ Awk có các biến FS và OFS).
Martin Bonner hỗ trợ Monica

@martin bonner: cảm ơn, nó có ý nghĩa ngay bây giờ. Tôi không biết làm thế nào tôi làm hỏng điều này.
Johan Boulé

36

Tôi thấy rằng đường ống mảng đến Out-Stringcmdlet cũng hoạt động tốt.

Ví dụ:

PS C:\> $a  | out-string

This
Is
a
cat

Nó phụ thuộc vào mục tiêu cuối cùng của bạn là phương pháp nào là tốt nhất để sử dụng.


4
FYI: chỉ cần làm $asẽ có tác dụng tương tự như$a | out-string
JohnLBevan

7
@JohnLBevan Không phải lúc nào. ($a | out-string).getType()= Chuỗi. $a.getType()= Đối tượng []. Nếu bạn đang sử dụng $ a làm đối số cho một phương thức mong đợi một chuỗi (chẳng hạn như chẳng invoke-expressionhạn), thì $a | out-stringcó một lợi thế rõ ràng.
rojo

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

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

Dòng hai thực hiện thao tác và đầu ra cho máy chủ, nhưng không sửa đổi $ a:

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

4> $a

This Is a cat

5> $a.Count

1

10

Từ một đường ống

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

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

Máy chủ lưu trữ

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

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

Thí dụ


Đây là một mẹo tuyệt vời. Ví dụ không hoạt động nữa và mặc dù câu trả lời này đã 5 tuổi, tôi cố gắng giải thích những gì tôi học được hôm nay. Biến $ofsOutput Field Separatorbiến được sử dụng khi một mảng được chuyển đổi thành chuỗi cho đầu ra. Ở đây, nó được đặt trong khối kịch bản trả về giá trị chuỗi của đầu vào (mảng từ đường ống) được thực thi bởi lệnh &. Trước đây tôi không biết $ofs, cũng như &chấp nhận một khối kịch bản làm đối số
Martin Konopka

3

Bạn có thể chỉ định loại như thế này:

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

Kiểm tra loại:

$a.GetType()

Xác nhận:

    Tên cơ sở IsPublic Tên cơ sở
    -------- -------- ---- --------
    Đúng chuỗi đúng [] System.Array

Xuất ra $ a:

PS C: \> $ a 
Điều này 
Là 
một 
con mèo

0
$a = "This", "Is", "a", "cat"

foreach ( $word in $a ) { $sent = "$sent $word" }
$sent = $sent.Substring(1)

Write-Host $sent
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.