如何在PowerShell中连接字符串和变量?

时间:2013-02-27 13:34:03

标签: powershell string-concatenation

假设我有以下代码段:

$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

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

您应该如何使用PowerShell进行此操作?

22 个答案:

答案 0 :(得分:504)

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

参见Windows PowerShell Language Specification Version 3.0,p34,子表达式扩展。

答案 1 :(得分:169)

似乎没有人提到单引号和双引号之间的区别。 (我使用的是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

单引号用于文字,请输出与此字符串完全相同的字符串。 双引号用于何时需要进行一些预处理(例如变量,特殊字符等)

所以:

$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我觉得很好参考)。

答案 2 :(得分:118)

一种方法是:

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

答案 3 :(得分:76)

您也可以使用-join

E.g。

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

将“John”分配给$ name。

所以输出一行:

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

答案 4 :(得分:51)

尝试在括号中包装您想要打印的内容:

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

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

答案 5 :(得分:22)

另一种选择是:

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

“最佳”方法可能是C.B.建议的那个:

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

答案 6 :(得分:15)

您需要将表达式放在括号中,以阻止它们被视为cmdlet的不同参数:

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

答案 7 :(得分:13)

表达时间:

"string1" + "string2" + "string3"

将连接字符串。您需要在括号前面加上一个$,以便在传递给powershell命令时将其作为单个参数进行求值。例如:

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

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

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

(实际上,我认为Powershell目前实现有点错误,需要在括号之间进行不必要的反差。如果微软只遵循“Python”或“TCL”括号规则,允许你输入任意数量的换行符在开始和结束括号之间,然后它们将解决人们不喜欢与线条延续相关的PowerShell的大部分问题,以及字符串的连接。我发现你可以在括号之间的线条延续上留下后面的勾号,但它真的很好,不可预测,如果它会工作..最好只添加反引号。)

答案 8 :(得分:11)

以下是另一种选择:

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

答案 9 :(得分:8)

我只是想用另一种方法来使用.NET String.Format

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

答案 10 :(得分:6)

这些答案看起来都非常复杂。如果您在PowerShell脚本中使用它,则可以执行以下操作:

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

将输出

  

我的名字是Slim Shady

注意如何在单词之间添加空格

答案 11 :(得分:6)

来自 What To Do / Not to Do in PowerShell: Part 1

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

答案 12 :(得分:5)

就像在DOS时代那样连接字符串。这对于日志记录来说是一个大问题,所以你去吧:

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

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

答案 13 :(得分:4)

每次我使用PowerShell后,我似乎都在努力解决这个问题(以及许多其他不直观的事情),所以我现在选择:

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

答案 14 :(得分:3)

(当前PS版本5.1.17134.407)

我想到此为止一切都说完了,但到目前为止也可以使用:

$myVar = "Hello"

echo "${myVar} World"

答案 15 :(得分:2)

Write-Host也可以这样连接:

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

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

答案 16 :(得分:1)

$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

答案 17 :(得分:0)

如果要串联字符串以构建文件路径,请使用join-path命令:

join-path C:\temp "MyNewFolder"

它将自动为您添加适当的尾部/前导斜线,这使事情变得容易得多。

如果这太过分了,我深表歉意,但我认为这可能会有所帮助。
如果一段时间不使用PowerShell,有时我会忘记它的存在并开始查找连接运算符。

答案 18 :(得分:0)

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

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

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

Output:

Slim Shady, The real slim shady

答案 19 :(得分:0)

如其他地方所述,您可以使用加入。

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

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

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

有关评论,请参见https://stackoverflow.com/a/34720515/11012871

答案 20 :(得分:-2)

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

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

但是,如果不指定对象的顺序,Powershell将以随机顺序显示值。因此应添加标志[ordered]

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

答案 21 :(得分:-6)

试试这个:

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