首页 文章

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

提问于
浏览
396

假设我有以下代码段:

$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来解决这个问题?

16 回答

  • 3

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

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

    似乎没有人提到单引号和双引号之间的区别 . (我使用的是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我觉得很好参考) .

  • 10

    试试这个:

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

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

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

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

  • 139

    这是另一种方式:

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

    一种方法是:

    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
    
  • 12
    Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"
    

    请参阅Windows PowerShell Language Specification Version 3.0,p34,子表达式扩展 .

  • 105

    要连接两个字符串以存储在函数中的变量/用途中,可以使用-join .

    例如 .

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

    将“John”分配给$ name .

    所以输出,在一行:

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

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

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

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

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

    虽然表达:

    "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的问题,以及字符串的连接 . 我发现你可以在括号之间的线条延续上留下后面的勾号,但是如果它能起作用真的很不稳定和不可预测..最好只添加反引号 . )

  • 4

    Write-Host也可以这样连接:

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

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

  • 2

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

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

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

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

    它会输出

    我的名字是Slim Shady

    请注意如何在单词之间放置空格

  • 45

    另一种选择是:

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

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

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

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

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

相关问题