Załóżmy, że mam następujący fragment kodu:
$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
Zamiast tego pokazuje:
42 + - + Slim Shady + - + Eminem
Co sprawia, że uważam, że +
operator nie jest odpowiedni do łączenia łańcuchów i zmiennych.
Jak do tego podejść z PowerShell?
powershell
string-concatenation
Cowgirl Ninja
źródło
źródło
Write-host ($assoc.Id.ToString() + " - " + $assoc.Name + " - " + $assoc.Owner)
tutaj $ assoc.Id jestInt32
więc musimy użyć jego reprezentacji ciągu. W przeciwnym razie PS próbuje wykonać dodawanie arytmetyczne zamiast konkatenacji.Odpowiedzi:
Zobacz specyfikację języka Windows PowerShell wersja 3.0 , str. 34, rozszerzenie podwyrażeń.
źródło
Write-Output
wsp też, więc jest to prawdopodobnie najbardziej użyteczne jeden mieć w swojej skrzynce narzędziowej."... $name ..."
będzie działać tak samo, ale w pierwotnym pytaniu, na które ta odpowiedź odpowiada, pytanie brzmi: jak uzyskać dostęp do właściwości obiektu. więc jeśli$name.id -eq 42
wtedy"... $name.id ..."
nie będzie działać tak, jak chcesz, ponieważ byłoby to uczynić jak... @{id=42}.id ...
zamiast żądanego... 42 ...
W tym celu należy użyć metody odpowiedź brzmi"... $($name.id) ..."
. Zakładki do pytania do edycji później.Wydaje się, że nikt nie wspomniał o różnicy między pojedynczymi i podwójnymi cudzysłowami. (Używam PowerShell 4).
Możesz to zrobić (jak powiedział @Ben):
Lub możesz to zrobić:
Pojedyncze cudzysłowy są dosłowne, proszę podać ciąg dokładnie tak jak ten. Podwójne cudzysłowy mają zastosowanie, gdy chcesz wykonać wstępne przetwarzanie (takie jak zmienne, znaki specjalne itp.)
Więc:
Natomiast:
( http://ss64.com/ps/syntax-esc.html Uważam, że jest dobry w celach informacyjnych).
źródło
Jednym ze sposobów jest:
Kolejny to:
Lub po prostu (ale mi się nie podoba;)):
źródło
$assoc.Id
i"
(i innymi). Oznacza to, że opcja 1 dajeId__-__Name__-__Owner
(dwa spacje po każdej stronie każdej-
), ale opcja 3 dajeId___-___Name___-___Owner
( trzy spacje).$assoc.Id"###"$assoc.Name
będzie dodać spacje po obu stronach ###, gdzie"$($assoc.Id)###$($assoc.Name)"
nie będzie .Możesz także użyć
-join
Na przykład
Przypisałby „John” do $ name.
Aby wyprowadzić, w jednym wierszu:
źródło
Spróbuj owinąć wszystko, co chcesz wydrukować w nawiasie:
Twój kod jest interpretowany jako przekazywany do wielu parametrów
Write-Host
. Zawijanie go w nawiasie połączy wartości, a następnie przekaże wynikową wartość jako pojedynczy parametr.źródło
Write-Debug
lub wWrite-Verbose
celu uwzględnienia podwójnych cudzysłowów i wartości zmiennych, takich jakWrite-Debug ('Running "cmdlet" with parameter $MyVar = ' + $MyVar + " at time " + (Get-Date -DisplayHint Time))
Inną opcją jest:
„Najlepszą” metodą jest prawdopodobnie ta, którą sugeruje CB:
źródło
StringBuilder
opcję, jeśli idziesz szalony. ; ^)Musisz umieścić wyrażenie w nawiasach, aby nie były traktowane jako inne parametry niż polecenie cmdlet:
źródło
Podczas wyrażania:
połączy łańcuchy. Musisz umieścić $ przed nawiasiem, aby był oceniany jako pojedynczy argument po przekazaniu do polecenia PowerShell. Przykład:
Jako bonus, jeśli chcesz, aby obejmował wiele linii, musisz użyć składni backtick ackward na końcu linii (bez spacji lub znaków po prawej stronie backtick). Przykład:
(Właściwie myślę, że Powershell jest obecnie nieco zaimplementowany, ponieważ wymaga niepotrzebnych tyknięć wstecz między nawiasami. Jeśli Microsoft po prostu zastosuje się do reguł nawiasów „Python” lub „TCL”, pozwalając na wstawianie dowolnej liczby nowych wierszy między początkiem a kończąc nawias, rozwiążą większość problemów, których ludzie nie lubią na temat PowerShell związanej z kontynuacją linii i konkatenacją ciągów. Odkryłem, że możesz pozostawić zaznaczenia wsteczne czasami w kontynuacjach linii między nawiasami, ale jest to naprawdę płatkowe i nieprzewidywalne, jeśli zadziała ... lepiej po prostu dodać backticks.)
źródło
Oto inny sposób jako alternatywa:
źródło
Chcę tylko przynieść inny sposób, aby to zrobić za pomocą .NET String.Format :
źródło
String.Format
zamiast starej zwykłej"{0}" -f $var
? Nie widzę sensu w używaniu kodu .NET, w którym zwykły PowerShell może wykonać zadanie ...(Aktualna wersja PS 5.1.17134.407)
Wydaje mi się, że wszystko zostało już powiedziane i zrobione, ale teraz działa to również:
Uwaga: działa to tylko z podwójnymi cudzysłowami
źródło
Wszystkie te odpowiedzi wydają się bardzo skomplikowane. Jeśli używasz tego w skrypcie PowerShell, możesz po prostu to zrobić:
Wyjdzie
Zwróć uwagę, jak między słowami jest wstawiana spacja
źródło
Od Co robić / czego nie robić w PowerShell: Część 1 :
źródło
Łączy ciągi, tak jak w czasach DOS. To wielka sprawa dla logowania, więc proszę:
źródło
Wydaje mi się, że mam trudności z tym (i wieloma innymi nieintuicyjnymi rzeczami) za każdym razem, gdy korzystam z programu PowerShell po pewnym czasie, więc teraz wybieram:
źródło
Write-Host może również łączyć w ten sposób:
To najprostszy sposób, IMHO.
źródło
źródło
Jeśli łączysz łańcuchy w celu budowania ścieżek plików, użyj polecenia join-path:
Automatycznie doda odpowiednie końcowe / końcowe ukośniki, co znacznie ułatwia.
Przepraszam, jeśli jest to zbyt nie na temat, ale pomyślałem, że to może trochę pomóc.
Jeśli nie używam programu PowerShell przez jakiś czas, czasami zapomnę, że istnieje i zacznę szukać operatorów konkatenacji.
źródło
Możesz także uzyskać dostęp do metod C # / .NET i działa również:
źródło
Tylko dla zabawy. Możesz również uzyskać dostęp do wartości PSObject bezpośrednio jak poniżej:
Ale jeśli nie określisz, że obiekt powinien być zamówiony, Powershell wyświetli wartości w losowej kolejności. Więc powinienem dodać flagę [zamówioną]
źródło