假设我有以下片段:

$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实现这一点?


当前回答

每次我在离开PowerShell之后使用PowerShell时,我似乎都会纠结于这个问题(以及其他许多不直观的事情),所以我现在选择:

[string]::Concat("There are ", $count, " items in the list")

其他回答

您也可以使用-join

E.g.

$var = -join("Hello", " ", "world");

将为$var分配“Hello world”。

因此,在一行中输出:

Write-Host (-join("Hello", " ", "world"))
$assoc = @{
    Id = 34
    FirstName = "John"
    LastName = "Doe"
    Owner = "Wife"
}

$assocId = $assoc.Id
$assocFN = $assoc.FirstName
$assocLN = $assoc.LastName
$assocName = $assocFN, $assocLN -Join " "
$assocOwner = $assoc.Owner

$assocJoin = $assocId, $assocName, $assocOwner -join " - "
$assocJoin
#Output = 34 - John Doe - Wife

一种方法是:

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

另一个是:

Write-Host  ("{0}  -  {1}  -  {2}" -f $assoc.Id,$assoc.Name,$assoc.Owner )

或者只是(但我不喜欢;):

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

这些答案看起来都很复杂。如果在PowerShell脚本中使用此功能,则只需执行以下操作:

$name = 'Slim Shady'
Write-Host 'My name is'$name

它将输出

我叫斯利姆·沙迪

注意单词之间是如何放置空格的

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、 以及串的串联。

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