次のようなコードがあるとします。
$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でこれにどのように取り組むべきですか。
Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"
Windows PowerShell言語仕様バージョン3.0 、p34、部分式の展開を参照してください。
一重引用符と二重引用符の違いについては、誰も言及していないようです。
あなたはこれを行うことができます(@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 参照用に良いと思う)。
一つの方法は:
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
-join
を使うこともできます
例えば。
$name = -join("Jo", "h", "n");
"John"を$ nameに割り当てます。
一行で出力する:
Write-Host (-join("Jo", "h", "n"))
印刷したいものを括弧で囲んでみてください。
Write-Host ($assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner)
あなたのコードはWrite-Host
に渡される多くのパラメータとして解釈されています。括弧で囲むと値が連結され、結果の値が単一のパラメーターとして渡されます。
他の選択肢は:
$string = $assoc.ID
$string += " - "
$string += $assoc.Name
$string += " - "
$string += $assoc.Owner
Write-Host $string
「最善の」方法はおそらくC.B.が提案した方法です。
Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"
コマンドレットの別のパラメーターとして扱われないようにするには、式を括弧で囲む必要があります。
Write-Host ($assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner)
表現中:
"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について人々が好まない問題の大部分を解決するでしょう。うまく動くのであれば、本当にゆるくて予測不可能です。
別の方法として、これがあります。
Write-Host (" {0} - {1} - {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)
私は.NET String.Format を使用してこれを実行する別の方法を持ちたいだけです。
$name = "Slim Shady"
Write-Host ([string]::Format("My name is {0}", $name))
これらの答えはすべて非常に複雑に思えます。これをPowerShellスクリプトで使用している場合は、単純にこれを実行できます。
$name = 'Slim Shady'
Write-Host 'My name is'$name
出力します
私の名前はSlim Shadyです
単語の間にスペースが入っていることに注意してください。
FromPowerShellですべきこと/しないこと:パート1:
$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
DOS時代のように文字列を連結します。これはロギングにとって大したことなので、ここでは次のようにします。
$strDate = Get-Date
$strday = "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output $strday
PowerShellを使用するたびに、これ(および他の多くの直感に反すること)に苦労しているように思われるので、今は次のことを選択します。
[string]::Concat("There are ", $count, " items in the list")
(現在のPSバージョン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"
}
$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