Hoe voeg ik strings en variabelen samen in PowerShell?

Stel dat ik het volgende fragment heb:

$assoc = New-Object PSObject -Property @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}
Write-Host $assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner

Ik verwacht dat dit fragment wordt weergegeven:

42 - Slim Shady - Eminem

Maar in plaats daarvan toont het:

42 + - + Slim Shady + - + Eminem

Daardoor denk ik dat de operator +niet geschikt is voor het aaneenschakelen van tekenreeksen en variabelen.

Hoe moet je dit aanpakken met PowerShell?


Antwoord 1, autoriteit 100%

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

Zie de Windows PowerShell-taalspecificatie versie 3.0, p34, sub- uitdrukkingen uitbreiding.


Antwoord 2, autoriteit 38%

Er is een verschil tussen enkele en dubbele aanhalingstekens. (Ik gebruik PowerShell 4).

U kunt dit doen (als Benjamin zei):

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

Of je kunt dit doen:

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

De enkele aanhalingstekens zijn voor letterlijke, voer de tekenreeks precies zo uit, alstublieft.
De dubbele aanhalingstekens zijn voor wanneer u een pre-processing uitvoert (zoals variabelen, speciale tekens, enz.)

Dus:

$name = "Marshall Bruce Mathers III"
Write-Host "$name"
-> Marshall Bruce Mathers III

overwegende dat:

$name = "Marshall Bruce Mathers III"
Write-Host '$name'
-> $name

(ik vind How-to: escape personages, delimiters en citaten goed voor referentie).


Antwoord 3, Autoriteit 21%

U kunt ook -join

gebruiken

b.g

$var = -join("Hello", " ", "world");

zou “Hallo World” toewijzen aan $ Var.

Dus om uit te voeren, in één regel:

Write-Host (-join("Hello", " ", "world"))

Antwoord 4, Autoriteit 18%

One Way is:

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

Nog een is:

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

of gewoon (maar ik vind het niet leuk;)):

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

Antwoord 5, Autoriteit 10%

Probeer te wikkelen wat u tussen haakjes wilt afdrukken:

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

Uw code wordt geïnterpreteerd als veel parameters die worden doorgegeven aan Write-Host. Als u het tussen haakjes plaatst, worden de waarden samengevoegd en wordt de resulterende waarde als een enkele parameter doorgegeven.


Antwoord 6, autoriteit 5%

Een andere optie is:

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

De “beste” methode is waarschijnlijk degene die C.B. heeft voorgesteld:

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

Antwoord 7, autoriteit 4%

Terwijl expressie:

"string1" + "string2" + "string3"

de tekenreeks samenvoegt, moet u een $ voor de haakjes plaatsen om het als een enkel argument te laten evalueren wanneer het wordt doorgegeven aan een PowerShell-opdracht. Voorbeeld:

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

Als een bonus, als je wilt dat het meerdere regels beslaat, moet je de onhandige backtick-syntaxis aan het einde van de regel gebruiken (zonder spaties of tekens rechts van de backtick).

Voorbeeld:

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

(Eigenlijk denk ik dat Powershell momenteel een beetje fout is geïmplementeerd door onnodige backticks tussen haakjes te vereisen. Als Microsoft gewoon Python of TCL haakjes regels om u te laten zetten Zoals veel newlines als je wilt tussen het begin en het einde van haakjes, zouden ze het grootste deel van de problemen oplossen die mensen niet leuk vinden aan PowerShell gerelateerd aan lijnvoortzetting en aaneenschakeling van strings.

Ik heb ontdekt dat je de backticks soms op de lijn continuaties tussen haakjes kunt laten, maar het is echt schilferig en onvoorspelbaar als het zal werken … Het is beter om gewoon de backticks toe te voegen.)


Antwoord 8, Autoriteit 3%

U moet de uitdrukking tussen haakjes plaatsen om te voorkomen dat ze worden behandeld als verschillende parameters op de CMDLET:

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

Antwoord 9, Autoriteit 2%

Hier is een andere manier als alternatief:

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

Antwoord 10

(huidige PowerShell-versie 5.1.17134.407)

Dit werkt ook vanaf nu:

$myVar = "Hello"
echo "${myVar} World"

Opmerking: dit werkt alleen met dubbele aanhalingstekens


Antwoord 11

Ik wil gewoon een andere manier meenemen om dit te doen met .NET string.format :

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

Antwoord 12

Deze antwoorden lijken allemaal erg ingewikkeld. Als u dit gebruikt in een PowerShell-script, kunt u dit eenvoudig doen:

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

het wordt uitgevoerd

Mijn naam is slank schaduw

Merk op hoe een ruimte wordt geplaatst tussen de woorden voor u


Antwoord 13

van Wat te doen / niet te doen in PowerShell: deel 1 :

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

Antwoord 14

Concatenate-snaren zoals in de DOS-dagen. Dit is een big deal voor het loggen, dus hier ga je:

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

Antwoord 15

Ik schijn hiermee te moeite met deze (en vele andere niet-intuïteieve dingen) elke keer als ik PowerShell na de tijd van het verwijderd gebruik, dan kies ik nu voor:

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

Antwoord 16

write-host kan samenvoegen Zo ook:

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

Dit is de eenvoudigste manier, IMHO.


Antwoord 17

Als u tekenreeksen aaneenvoegt om bestandspaden te bouwen, gebruikt u de Join-Pathcommando:

Join-Path C:\temp "MyNewFolder"

Het voegt automatisch de juiste slashes voor u toe, wat het een stuk eenvoudiger maakt.


Antwoord 18

$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

Antwoord 19

Je kunt ook toegang krijgen tot C#/.NET-methoden, en het volgende werkt ook:

$string1 = "Slim Shady, "
$string2 = "The real slim shady"
$concatString = [System.String]::Concat($string1, $string2)
Output:
Slim Shady, The real slim shady

Antwoord 20

Zoals elders vermeld, kunt u join gebruiken.

Als je commando’s als invoer gebruikt (zoals ik was), gebruik dan de volgende syntaxis:

-join($(Command1), "," , $(Command2))

Dit zou resulteren in de twee uitgangen gescheiden door een komma.

Zie https://stackoverflow.com/a/34720515/11012871voor gerelateerde opmerkingen


Antwoord 21

Gewoon voor de lol. U kunt ook rechtstreeks toegang krijgen tot de waarden van het PSObject zoals hieronder:

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

Maar als u niet opgeeft dat het object moet worden geordend, geeft PowerShell de waarden in willekeurige volgorde weer. U moet dus de vlag [ordered]toevoegen:

$assoc = [pscustomobject] [ordered] @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}

Other episodes