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

如何在PowerShell中连接字符串和变量?,powershell,string-concatenation,Powershell,String Concatenation,假设我有以下代码段: $assoc=新对象PSObject-属性@{ Id=42 Name=“Slim Shady” 所有者=“阿姆” } 写入主机$assoc.Id+“-”+$assoc.Name+“-”+$assoc.Owner 我希望这段代码能够显示: 42-细长阴影-Eminem 但它显示: 42+-+Slim Shady+-+Eminem 这让我觉得+运算符不适合连接字符串和变量 如何使用PowerShell实现此目的?您需要将表达式放在括号中,以防止它们被视为cmdlet的不同参数

假设我有以下代码段:

$assoc=新对象PSObject-属性@{
Id=42
Name=“Slim Shady”
所有者=“阿姆”
}
写入主机$assoc.Id+“-”+$assoc.Name+“-”+$assoc.Owner
我希望这段代码能够显示:

<代码>42-细长阴影-Eminem

但它显示:

42+-+Slim Shady+-+Eminem

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


如何使用PowerShell实现此目的?

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

Write-Host ($assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner)
请参见第34页的子表达式展开。

一种方法是:

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)

您的代码被解释为许多参数被传递到。将其包装在括号内将连接这些值,然后将结果值作为单个参数传递。

以下是另一种替代方法:

Write-Host (" {0}  -  {1}  -  {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)
另一个选择是:

$string = $assoc.ID
$string += " - "
$string += $assoc.Name
$string += " - "
$string += $assoc.Owner
Write-Host $string
“最佳”方法可能是C.B.建议的方法:

Write-Host "$($assoc.Id)  -  $($assoc.Name)  -  $($assoc.Owner)"
发件人:


这些答案似乎都很复杂。如果您在PowerShell脚本中使用此选项,只需执行以下操作:

$name = 'Slim Shady'
Write-Host 'My name is'$name
它将输出

我叫斯利姆·夏迪


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

单引号和双引号之间有区别。(我正在使用PowerShell 4)

您可以这样做(如下所示):

或者您可以这样做:

$name = 'Slim Shady'
Write-Host "My name is $name"
-> My name is Slim Shady
单引号表示文字,请按如下方式输出字符串。 双引号用于您希望完成某些预处理(例如变量、特殊字符等)时

因此:

鉴于:

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

(我觉得很有参考价值)。

您也可以使用
-join

例如

将“Hello world”分配给$var

因此,要在一行中输出:

Write-Host (-join("Hello", " ", "world"))

我只想用另一种方法使用.NET实现这一点:


像在DOS时代一样连接字符串。这对于日志记录来说是一件大事,所以您可以这样做:

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

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

每次离开PowerShell一段时间后使用PowerShell时,我似乎都在为这一点(以及许多其他不直观的事情)而挣扎,因此我现在选择:

[string]::Concat("There are ", $count, " items in the list")
也可以这样连接:

Write-Host $assoc.Id" - "$assoc.Name" - "$assoc.Owner
这是最简单的方法,IMHO。

而表达式:

"string1" + "string2" + "string3"
如果要连接字符串,则需要在括号前加$,使其在传递给PowerShell命令时作为单个参数进行计算。例如:

Write-Host $( "string1" + "string2" + "string3" )
另外,如果希望它跨越多行,则需要在行尾使用笨拙的反勾号语法(反勾号右侧没有任何空格或字符)

例如:

Write-Host $(`
    "The rain in "        +`
    "Spain falls mainly " +`
    "in the plains"       )`
    -ForegroundColor Yellow
(事实上,我认为PowerShell目前的实现有点错误,因为在括号之间需要不必要的反勾号。如果Microsoft只遵循或括号规则,允许您在起始括号和结束括号之间添加任意多的换行符,那么他们将解决大多数人们不喜欢的问题。)ut PowerShell与行延续和字符串串联相关

我发现,有时在括号之间的连续体上可以不使用反勾号,但如果它起作用的话,它确实是不稳定和不可预测的……最好只添加反勾号。)

(当前的PowerShell版本5.1.17134.407)

到目前为止,这也起作用:

$myVar = "Hello"

echo "${myVar} World"

注意:这只适用于双引号

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

$assoc.psobject.Properties.value -join " - "
但是,如果未指定对象应排序,PowerShell将以随机顺序显示值。因此,应添加标志
[ordered]

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

如果要连接字符串以生成文件路径,请使用以下命令:


它会自动为您添加适当的尾随/前导斜杠,这会使事情变得更简单。

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

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

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

Output:

Slim Shady, The real slim shady

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

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

-join($(Command1), "," , $(Command2))
这将导致两个输出以逗号分隔


请参阅以获取相关注释

如果所有元素都是字符串,并且表达式用括号括起来,则代码可以工作:
Write host($assoc.Id.ToString()+“-”+$assoc.Name+“-”+$assoc.Owner)
此处$assoc.Id是一个
Int32
,因此我们必须使用它的字符串表示法。否则PS会尝试执行算术加法而不是串联。鉴于视图的数量,我认为修复此问题的文本是合适的,尽管我的编辑对内容进行了相当大的更改。我已尝试保留该术语问题的逻辑/措辞和精神完好无损,同时对其进行了足够的改进,使其可以重新打开。如果您正在发疯,则需要添加
StringBuilder
选项。^)当然有一种方法可以将所需的属性导入外部文件,然后将其反序列化为用连字符连接的组件字符串(?)很难想象还有比这更糟糕的事情发生。字符串是不可变的,因此每个连接操作实际上会生成一个新字符串,复制原始字符串的字符。这应该是votted的答案您是gem@FrodeIn对Code Jockey的响应,每次使用+=可能会生成一个新字符串,但对于一个相对较小的字符串,添加其他类似的小字符串,谁在乎呢。清楚地了解正在发生的事情是最重要的,对于PowerShell来说,让事情正常运行比其他任何事情都重要。我不认为最后一项工作完全如您所期望的那样有效。看见Powershell将在输出中为
$assoc.Id
(等)之间的空格添加一个(即使此处有两个)空间。即,
Write-Host $( "string1" + "string2" + "string3" )
Write-Host $(`
    "The rain in "        +`
    "Spain falls mainly " +`
    "in the plains"       )`
    -ForegroundColor Yellow
$myVar = "Hello"

echo "${myVar} World"
$assoc.psobject.Properties.value -join " - "
$assoc = [pscustomobject] [ordered] @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}
$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
Join-Path C:\temp "MyNewFolder"
$string1 = "Slim Shady, "
$string2 = "The real slim shady"

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

Output:

Slim Shady, The real slim shady
-join($(Command1), "," , $(Command2))