Jak połączyć ciągi i zmienne w PowerShell?

Załóżmy, że mam następujący fragment:

$assoc = New-Object psobject -Property @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}

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

Spodziewałbym się, że ten fragment pokaże:

42 - Slim Shady - Eminem

Ale zamiast tego pokazuje:

42 + - + Slim Shady + - + Eminem

Co sprawia, że myślę, że operator + nie jest odpowiedni do łączenia łańcuchów i zmiennych.

Jak należy podejść do tego z PowerShell?

Author: Peter Mortensen, 2013-02-27

16 answers

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

Zobacz specyfikacja języka Windows PowerShell w wersji 3.0, p34, rozszerzenie pod-wyrażeń.

 388
Author: David Brabant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-18 19:32:01

Wydaje się, że nikt nie wspomniał o różnicy między cytatami pojedynczymi i podwójnymi. (Używam PowerShell 4).

Możesz to zrobić (jak powiedział @Ben):

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

Lub możesz to zrobić:

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

Pojedyncze cudzysłowy są dla literalnych, wypisuj łańcuch dokładnie tak, proszę. Podwójne cudzysłowy są przeznaczone do przetwarzania wstępnego (np. zmiennych, znaków specjalnych etc)

Więc:

$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 uważam za dobre dla odniesienia).

 126
Author: TinyRacoon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-08 13:01:28

Jedna droga to:

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

Kolejny to:

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

Albo po prostu (ale mi się to nie podoba;)):

Write-host $assoc.Id  "  -  "   $assoc.Name  "  -  "  $assoc.Owner
 102
Author: CB.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-12 18:24:09

Spróbuj zawijać to, co chcesz wydrukować w nawiasie:

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

Twój kod jest interpretowany jako wiele parametrów przekazywanych do Write-Host. Owinięcie go wewnątrz nawiasu połączy wartości, a następnie przekaże wynikową wartość jako pojedynczy parametr.

 38
Author: goric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-27 13:37:39

Aby połączyć dwa łańcuchy znaków do przechowywania w zmiennej/użycia w funkcji, można użyć -join.

Np.

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

Przypisze "John" do $name.

Więc do wyjścia, w jednej linii:

Write-Host (-join("Jo", "h", "n"))
 34
Author: manyways,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-19 19:07:05

Inna opcja to:

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

"najlepsza" metoda to chyba ta, którą zasugerował C. B.:

Write-host "$($assoc.Id)  -  $($assoc.Name)  -  $($assoc.Owner)"
 18
Author: Frode F.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-21 15:26:13

Musisz umieścić wyrażenie w nawiasach, aby nie były traktowane jako różne parametry do cmdleta:

Write-host ($assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner)
 14
Author: Richard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-13 17:46:25

Oto inny sposób jako alternatywa:

Write-host (" {0}  -  {1}  -  {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)
 10
Author: Dave Sexton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-27 13:42:57

While wyrażenie:

"string1" + "string2" + "string3"

Połączy struny. Musisz umieścić $ przed nawiasem, aby ocenić go jako pojedynczy argument po przekazaniu do polecenia powershell. Przykład:

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

Jako bonus, jeśli chcesz, aby obejmował wiele linii, musisz użyć składni ackward backtick na końcu linii (bez spacji lub znaków po prawej stronie backtic ' a). Przykład:

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

(właściwie, myślę, że Powershell jest obecnie zaimplementowany trochę źle by wymaga niepotrzebnych zwrotów między nawiasami. Jeśli Microsoft przestrzegałby reguł nawiasu" Python "lub" TCL", pozwalających na umieszczanie tylu nowych linii, ile chcesz między nawiasem początkowym i końcowym, rozwiązałby większość problemów, które ludzie nie lubią w powershell, związanych z kontynuacją linii i łączeniem łańcuchów. Odkryłem, że można czasami zostawić back-ticks off na linii między nawiasami, ale to naprawdę flakey i nieprzewidywalne, jeśli to zadziała.. lepiej po prostu dodać backticks.)

 9
Author: Bill Moore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-11 00:22:34

Chcę tylko wprowadzić inny sposób, aby to zrobić za pomocą. NET String.Format :

$name = "Slim Shady"
Write-Host ([string]::Format("My name is {0}", $name))
 7
Author: Martin Brandl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-26 18:11:40

Od Co robić / czego nie robić w PowerShell: Część 1:

$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
 6
Author: Mad Tom Vane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-12 18:25:52

Te odpowiedzi wydają się bardzo skomplikowane. Jeśli używasz tego w skrypcie PowerShell, możesz po prostu to zrobić:

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

Wyświetli

Nazywam się Slim Shady

Zauważ, jak spacja jest umieszczana między słowami dla ciebie

 6
Author: elev8ed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-12 18:26:35

Połącz struny, tak jak w czasach DOS. To jest wielka sprawa do logowania więc proszę bardzo:

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

Write-Output "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output $strday
 4
Author: Kelly Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-07 18:42:11

Wydaje mi się, że zmagam się z tym (i wieloma innymi nieintuicyjnymi rzeczami) za każdym razem, gdy używam PowerShella po pewnym czasie od niego, więc teraz wybieram:

[string]::Concat("There are ", $count, " items in the list")
 2
Author: Luke Puplett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-19 08:23:11

Write-Host może również łączyć się w ten sposób:

Write-Host $assoc.Id" - "$assoc.Name" - "$assoc.Owner
To jest najprostszy sposób, IMHO.
 2
Author: Mordechai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-17 12:50:46

Spróbuj tego:

$name = "Slim Shady"
Write-Host "My name is " $name
 -5
Author: Kiran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-29 16:54:21