Nin*_*irl 529 powershell string-concatenation
假设我有以下代码段:
$assoc = New-Object psobject -Property @{
Id = 42
Name = "Slim Shady"
Owner = "Eminem"
}
Write-host $assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner
Run Code Online (Sandbox Code Playgroud)
我希望这段代码显示:
42 - Slim Shady - Eminem
但相反它显示:
42 + - + Slim Shady + - + Eminem
这让我觉得+运算符不适合连接字符串和变量.
您应该如何使用PowerShell进行此操作?
Dav*_*ant 585
Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"
Run Code Online (Sandbox Code Playgroud)
请参阅Windows PowerShell语言规范版本3.0,p34,子表达式扩展.
Tin*_*oon 218
似乎没有人提到单引号和双引号之间的区别.(我使用的是PowerShell 4).
你可以这样做(正如@Ben所说):
$name = 'Slim Shady'
Write-Host 'My name is'$name
-> My name is Slim Shady
Run Code Online (Sandbox Code Playgroud)
或者你可以这样做:
$name = 'Slim Shady'
Write-Host "My name is $name"
-> My name is Slim Shady
Run Code Online (Sandbox Code Playgroud)
单引号用于文字,请输出完全相同的字符串.双引号用于何时需要进行一些预处理(例如变量,特殊字符等)
所以:
$name = "Marshall Bruce Mathers III"
Write-Host "$name"
-> Marshall Bruce Mathers III
Run Code Online (Sandbox Code Playgroud)
鉴于:
$name = "Marshall Bruce Mathers III"
Write-Host '$name'
-> $name
Run Code Online (Sandbox Code Playgroud)
(http://ss64.com/ps/syntax-esc.html我觉得很好参考).
CB.*_*CB. 124
一种方法是:
Write-host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"
Run Code Online (Sandbox Code Playgroud)
另一个是:
Write-host ("{0} - {1} - {2}" -f $assoc.Id,$assoc.Name,$assoc.Owner )
Run Code Online (Sandbox Code Playgroud)
或者只是(但我不喜欢它;)):
Write-host $assoc.Id " - " $assoc.Name " - " $assoc.Owner
Run Code Online (Sandbox Code Playgroud)
man*_*ays 99
你也可以使用 -join
例如
$name = -join("Jo", "h", "n");
Run Code Online (Sandbox Code Playgroud)
将"John"分配给$ name.
所以输出,在一行:
Write-Host (-join("Jo", "h", "n"))
Run Code Online (Sandbox Code Playgroud)
gor*_*ric 60
尝试在括号中包装您想要打印的任何内容:
Write-host ($assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner)
Run Code Online (Sandbox Code Playgroud)
您的代码被解释为传递给许多参数Write-Host.将其括在括号内将连接值,然后将结果值作为单个参数传递.
Fro*_* F. 28
另一种选择是:
$string = $assoc.ID
$string += " - "
$string += $assoc.Name
$string += " - "
$string += $assoc.Owner
Write-Host $string
Run Code Online (Sandbox Code Playgroud)
CB的建议可能是"最佳"方法:
Write-host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"
Run Code Online (Sandbox Code Playgroud)
Ric*_*ard 18
您需要将表达式放在括号中以阻止它们被视为cmdlet的不同参数:
Write-host ($assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner)
Run Code Online (Sandbox Code Playgroud)
Bil*_*ore 17
表达时:
"string1" + "string2" + "string3"
Run Code Online (Sandbox Code Playgroud)
将连接字符串.您需要在括号前面加上一个$,以便在传递给powershell命令时将其作为单个参数进行求值.例:
Write-Host $( "string1" + "string2" + "string3" )
Run Code Online (Sandbox Code Playgroud)
作为奖励,如果您希望它跨越多行,那么您需要在行尾使用ackward反引号语法(在反引号的右侧没有任何空格或字符).例:
Write-Host $(`
"The rain in " +`
"Spain falls mainly " +`
"in the plains" )`
-ForegroundColor Yellow
Run Code Online (Sandbox Code Playgroud)
(实际上,我认为Powershell目前实现有点错误,需要在括号之间进行不必要的反差.如果微软只遵循"Python"或"TCL"括号规则,允许您在启动和启动之间放置任意数量的换行符.结束括号然后他们将解决人们不喜欢与线条延续相关的PowerShell的大多数问题,以及字符串的连接.我发现你可以在括号之间的线条延续上留下后面的勾号,但是如果能够工作的话真的很不稳定和不可预测..最好只添加反引号.)
Dav*_*ton 12
以下是另一种方式:
Write-host (" {0} - {1} - {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)
Run Code Online (Sandbox Code Playgroud)
我只是想用另一种方法来使用.NET String.Format:
$name = "Slim Shady"
Write-Host ([string]::Format("My name is {0}", $name))
Run Code Online (Sandbox Code Playgroud)
我个人比较喜欢这种风格:
[string]::Join(' - ', 42, 'Slim Shady', 'Eminem')
Run Code Online (Sandbox Code Playgroud)
或者基于具有不同属性类型的任何对象:
$assoc = [psCustomObject][ordered]@{
Id = 42
Name = 'Slim Shady'
Owner = 'Eminem'
}
[string]::Join(' - ',$assoc.psObject.Properties.value)
Run Code Online (Sandbox Code Playgroud)
这给你这个结果:
42 - Slim Shady - Eminem
Run Code Online (Sandbox Code Playgroud)
$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
Run Code Online (Sandbox Code Playgroud)
这些答案看起来都非常复杂.如果您在PowerShell脚本中使用它,则可以执行以下操作:
$name = 'Slim Shady'
Write-Host 'My name is'$name
Run Code Online (Sandbox Code Playgroud)
它会输出
我的名字是Slim Shady
请注意如何在单词之间放置空格
小智 6
就像在DOS时代一样,连接字符串。这对于日志记录来说意义重大,因此您可以开始以下操作:
$strDate = Get-Date
$strday = "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output $strday
Run Code Online (Sandbox Code Playgroud)
(当前PS版本5.1.17134.407)
我猜到现在所有的事情都说完了,但是到目前为止也可以使用:
$myVar = "Hello"
echo "${myVar} World"
Run Code Online (Sandbox Code Playgroud)
每当我在远离PowerShell的情况下使用PowerShell时,我似乎都在为它(以及许多其他不直观的东西)而苦恼,因此我现在选择:
[string]::Concat("There are ", $count, " items in the list")
Run Code Online (Sandbox Code Playgroud)
Write-Host也可以像这样连接:
Write-Host $assoc.Id" - "$assoc.Name" - "$assoc.Owner
Run Code Online (Sandbox Code Playgroud)
这是最简单的方法,恕我直言。
| 归档时间: |
|
| 查看次数: |
1147573 次 |
| 最近记录: |