假设我有以下片段:

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

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

我希望这段代码显示:

42-Slim Shady-阿姆

但相反,它显示:

42+-+斯利姆·沙迪+-+埃米纳姆

这让我觉得+运算符不适合连接字符串和变量。

您应该如何使用PowerShell实现这一点?


当前回答

您还可以访问C#/.NET方法,以下方法也适用:

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

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

Output:

Slim Shady, The real slim shady

其他回答

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

请参阅Windows PowerShell语言规范3.0版p34子表达式扩展。

只是为了好玩。您还可以直接访问PSObject的值,如下所示:

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

但如果未指定对象的顺序,PowerShell将以随机顺序显示值。因此,您应该添加标记[ordered]:

$assoc = [pscustomobject] [ordered] @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}

就我个人而言,我更喜欢这种风格:

[string]::Join(' - ', 42, 'Slim Shady', 'Eminem')

或基于具有甚至不同属性类型的任何对象:

$assoc = [psCustomObject][ordered]@{
    Id    = 42
    Name  = 'Slim Shady'
    Owner = 'Eminem'
}
[string]::Join(' - ',$assoc.psObject.Properties.value)

这给了您这样的结果:

42 - Slim Shady - Eminem

如其他地方所述,可以使用join。

如果您使用命令作为输入(就像我一样),请使用以下语法:

-join($(Command1), "," , $(Command2))

这将导致两个输出用逗号分隔。

看见https://stackoverflow.com/a/34720515/11012871相关评论

While表达式:

"string1" + "string2" + "string3"

将连接字符串,您需要在括号前放一个$,使其在传递给PowerShell命令时作为单个参数求值。例子:

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

另外,如果您希望它跨越多行,则需要在行的末尾使用尴尬的反引号语法(反引号右侧没有空格或字符)。

例子:

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

(事实上,我认为PowerShell当前的实现有点错误,因为它在括号之间需要不必要的反引号。如果Microsoft只是遵循Python或Tcl括号规则,允许您在开始括号和结束括号之间插入任意多的换行符,那么它们将解决大多数人们不喜欢的PowerShell与换行符相关的问题n、 以及串的串联。

我发现有时可以在括号之间的换行符上去掉反引号,但如果它能起作用,那真的很难预测。。。最好只添加反引号。)