PowerShell:如何在PowerShell中将数组对象转换为字符串?

217

我该如何将数组对象转换为字符串?

我尝试了以下代码:

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

没有运气在PowerShell中有哪些不同的可能性?


6
我看了你的回答,但是你的代码也很好用。为什么要说“没成功”呢? - Roman Kuzmin
4
抱歉,是的,它似乎有效,我认为在测试时可能弄错了什么。 - jrara
6个回答

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

使用 join 运算符

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

# ThisIsacat
-join $a

使用 [string] 转换

# This Is a cat
[string]$a

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

14
对于像我这样的新手,$ofs这里有详细说明。 - Liam
20
由于 Stackoverflow Documentation 已经关闭,因此 Liam 的链接已经失效。这里提供另一个关于 $OFS(输出字段分隔符)的解释链接:https://blogs.msdn.microsoft.com/powershell/2006/07/15/psmdtagfaq-what-is-ofs/ - Simon Elms
1
@JohanBoulé:因为使用输入字段分隔符的第一个字符作为输出字段分隔符是一种恶劣的hack方法,而且不能使用多字符字符串分隔字段。(例如,Awk有FS和OFS变量)。 - Martin Bonner supports Monica
1
官方文档在这里:https://github.com/MicrosoftDocs/PowerShell-Docs/blob/staging/reference/6/Microsoft.PowerShell.Core/About/about_Preference_Variables.md#ofs - testworks
1
似乎您无法在一定时间后编辑评论。以下是一些有效的链接:学习 Microsoft PowerShell 7.1 GitHub PowerShell 7.1 - testworks
显示剩余3条评论

48

我发现将数组传输到Out-String命令也很有效。

例如:

PS C:\> $a  | out-string

This
Is
a
cat

根据你的最终目标来确定使用哪种方法最佳。


5
жіЁж„Џпјљд»…дЅїз”Ё$aдёЋ$a | out-stringе…·жњ‰з›ёеђЊзљ„ж•€жћњгЂ‚ - JohnLBevan
9
并非总是这样。($a | out-string).getType() 的结果为字符串类型,而 $a.getType() 的结果为对象数组类型。如果你将 $a 作为期望接收字符串类型参数的方法(例如 invoke-expression)的参数,那么 $a | out-string 显然更加优越。 - rojo
请注意,使用Out-String命令时,根据主机程序的特性,可能会截断长行,导致长变量被换行显示到另一行上。请参考Width参数。 - Minkus

24
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

13

通过管道

# 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'

示例


2
这是一个惊人的技巧。示例不再起作用,尽管这个答案已经有5年了,但我今天尝试解释我学到的东西。$ofs输出字段分隔符 变量,当将数组转换为输出字符串时使用。在这里,它被设置在脚本块中,返回输入(来自管道的数组)的字符串值,该值由命令 & 执行。我之前不知道 $ofs,也不知道 & 接受脚本块作为参数。 - Martin Konopka
$input 变量。https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-7.3#input - Winand

4
您可以像这样指定类型:

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

检查数据类型:

$a.GetType()

确认结果:

是否公共 是否序列化 名称        基类
-------- -------- ----        --------
True     True     String[]    System.Array

输出 $a:

PS C:\> $a 
This 
Is 
a 
cat

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

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

Write-Host $sent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接