假设我有以下代码段:
$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进行此操作?
答案 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)
答案 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))
这将导致两个输出之间用逗号分隔。
答案 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