如何在PowerShell中连接string和variables?

假设我有以下代码片段:

$assoc = New-Object psobject -Property @{ Id = 42 Name = "Slim Shady" Owner = "Eminem" } Write-host $assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner 

我期望这个片段显示:

42 - Slim Shady - Eminem

但相反,它显示:

42 + - + Slim Shady + - + Eminem

这使我认为+运算符不适合连接string和variables。

你应该如何用PowerShell来解决这个问题?

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

请参阅Windows PowerShell语言规范版本3.0 ,p34,子expression式扩展。

一种方法是:

 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 4)。

你可以这样做(就像@Ben所说的):

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

或者你可以这样做:

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

单引号是字面的,请输出完全像这样的string。 双引号是为了当你想做一些预处理(如variables,特殊字符等)

所以:

 $name = "Marshall Bruce Mathers III" Write-Host "$name" -> Marshall Bruce Mathers III 

鉴于:

 $name = "Marshall Bruce Mathers III" Write-Host '$name' -> $name 

http://ss64.com/ps/syntax-esc.html我觉得很好参考)。;

尝试用括号将任何你想打印的东西包装起来:

 Write-host ($assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner) 

您的代码被解释为传递给Write-Host许多参数。 将它括在括号内将连接值,然后将结果值作为单个parameter passing。

要连接两个string以存储variables/在函数中使用,可以使用-join。

例如

 $name = -join("Jo", "h", "n"); 

将“约翰”分配给$名称。

所以输出,在一行中:

 Write-Host (-join("Jo", "h", "n")) 

另一个select是:

 $string = $assoc.ID $string += " - " $string += $assoc.Name $string += " - " $string += $assoc.Owner Write-Host $string 

“最好”的方法可能是CBbuild议的一个方法:

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

您需要将expression式放在括号中以阻止它们作为cmdlet的不同参数处理:

 Write-host ($assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner) 

这是另一种方法:

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

我只是想带来另一种方式来使用.NET String.Format :

 $name = "Slim Shady" Write-Host ([string]::Format("My name is {0}", $name)) 

做什么/不做PowerShell:第1部分

 $id = $assoc.Id $name = $assoc.Name $owner = $assoc.owner "$id - $name - $owner" 

这些答案似乎都很复杂。 如果你在PowerShell脚本中使用这个,你可以简单地这样做:

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

它会输出

我叫Slim Shady

请注意,这些单词之间的空间是如何放置的

像DOS时代一样连接string。 这是一个很重要的日志,所以在这里你去:

 $strDate = Get-Date $strday = "$($strDate.Year)$($strDate.Month)$($strDate.Day)" Write-Output "$($strDate.Year)$($strDate.Month)$($strDate.Day)" Write-Output $strday 

表情:

 "string1" + "string2" + "string3" 

将连接string。 在传递给powershell命令时,您需要在括号前放置一个$作为单个参数。 例:

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

作为奖励,如果你想让它跨越多行,那么你需要在行尾使用反斜杠语法(在反引号的右边没有任何空格或字符)。 例:

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

(实际上,我认为Powershell目前的实现有点不对,要求括号之间有不必要的反斜杠,如果微软只是遵循“Python”或“TCL”的括号规则,允许在开始和结束之间放置尽可能多的新行那么他们就可以解决大部分人们不喜欢的有关PowerShell相关的续行和string串联的问题,我发现你可以在回车符之间的连续线上留下反码,但是它的括号如果它能工作的话,它真的是不可预测的,只是添加反引号而已。)

我似乎与这个(和许多其他不直观的事情)斗争,每次我离开后使用PowerShell,所以我现在select:

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

写主机也可以这样连接:

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

这是最简单的方法,恕我直言。

尝试这个:

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