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"
}