web-dev-qa-db-ja.com

PowerShellで文字列と変数を連結する方法

次のようなコードがあるとします。

$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でこれにどのように取り組むべきですか。

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

Windows PowerShell言語仕様バージョン3.0 、p34、部分式の展開を参照してください。

459
David Brabant

一重引用符と二重引用符の違いについては、誰も言及していないようです。

あなたはこれを行うことができます(@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 参照用に良いと思う)。

154
TinyRacoon

一つの方法は:

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
111
CB.

-joinを使うこともできます

例えば。

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

"John"を$ nameに割り当てます。

一行で出力する:

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

印刷したいものを括弧で囲んでみてください。

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

あなたのコードはWrite-Hostに渡される多くのパラメータとして解釈されています。括弧で囲むと値が連結され、結果の値が単一のパラメーターとして渡されます。

45
goric

他の選択肢は:

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

「最善の」方法はおそらくC.B.が提案した方法です。

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

コマンドレットの別のパラメーターとして扱われないようにするには、式を括弧で囲む必要があります。

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

表現中:

"string1" + "string2" + "string3"

文字列を連結します。 powershellコマンドに渡されたときに単一の引数として評価されるようにするには、括弧の前に$を付ける必要があります。例:

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

ボーナスとして、あなたがそれを複数の行にまたがるようにしたいなら、あなたは行の終わりに(バッククォートの右側にスペースや文字を入れずに)厄介なバックティック構文を使う必要があります。例:

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

(実際には、Powershellは括弧の間に不要なバックティックを必要とするため、現在は少し間違って実装されていると思います。Microsoftが "Python"または "TCL"に従った場合最後の括弧は、行の継続や、文字列の連結に関連するPowerShellについて人々が好まない問題の大部分を解決するでしょう。うまく動くのであれば、本当にゆるくて予測不可能です。

13
Bill Moore

別の方法として、これがあります。

Write-Host (" {0}  -  {1}  -  {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)
10
Dave Sexton

私は.NET String.Format を使用してこれを実行する別の方法を持ちたいだけです。

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

これらの答えはすべて非常に複雑に思えます。これをPowerShellスクリプトで使用している場合は、単純にこれを実行できます。

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

出力します

私の名前はSlim Shadyです

単語の間にスペースが入っていることに注意してください。

6
elev8ed

FromPowerShellですべきこと/しないこと:パート1

$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
6
E.V.I.L.

DOS時代のように文字列を連結します。これはロギングにとって大したことなので、ここでは次のようにします。

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

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

PowerShellを使用するたびに、これ(および他の多くの直感に反すること)に苦労しているように思われるので、今は次のことを選択します。

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

Write-Host このように連結することもできます。 

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

これが最も簡単な方法です、私見。

2
Mordechai

(現在のPSバージョン5.1.17134.407)

これですべて完了したと思いますが、これは現在のところうまくいきます

$myVar = "Hello"

echo "${myVar} World"
1
Benjamin

楽しみのためだけに。以下のようにPSObjectの値に直接アクセスすることもできます。

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

しかし、オブジェクトの順序付けを指定しないと、Powershellは値をランダムな順序で表示します。フラグ[ordered]を追加する必要があります

$assoc = [pscustomobject] [ordered] @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}
0
R.Amersfoort
$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
0
blayderunner123