2012-11-13 8 views
9

Załóżmy, że mam dokument c:\temp\temp.txt z zawartościąZachowaj nowe linie kiedy złączenie lub używając heredoc w PowerShell

line 1 
line 2 

i utworzyć następującą funkcję

PS>function wrapit($text) { 
@" 
---Start--- 
$text 
---End--- 
"@ 
} 

następnie uruchomić PS> wrapit((Get-Content c:\temp\temp.txt))

wyjście będzie

---Start--- 
line 1 line 2 
---End--- 

Jak zachować nowe linie? Dołączanie do interpolacji nie pomaga.

I found this related question, ale tutaj używają tablicy łańcuchów. Używam pojedynczego łańcucha znaków, który zawiera znaki nowej linii (możesz je zobaczyć, jeśli wypiszesz łańcuch bezpośrednio z wewnątrz funkcji bez łączenia i $text | gm potwierdza, że ​​pracuję z łańcuchem, a nie z tablicą). Mogę zrobić cały tekst parsowania na świecie, żeby go uderzyć, ale wydaje mi się, że będę walił w kwadratowy kołek w okrągłej dziurze. Jaka jest koncepcja, której mi brakuje?

Odpowiedz

10

prosty sposób, aby zrobić to, co chcesz:

wrapit((Get-Content c:\temp\temp.txt | out-string)) 

Teraz wyjaśnienie: Here-stringi @ "" po prostu zachowują się jak ciągi znaków "", a rezultat wynika z zachowania PowerShell w rozszerzaniu zmiennych. Wystarczy spróbować:

$a = Get-Content c:\temp\temp.txt 
"$a" 

Odnośnie komentarza:

$a | Get-Member 
TypeName: System.String 
... 

Ale

Get-Member -InputObject $a 
TypeName: System.Object[] 
... 

Pierwsza odpowiedź jest OK (odbiera ciągi). Po prostu za każdym razem nie powtarza System.string. W drugim otrzymuje tablicę jako parametr.

+0

Jeśli mam rację, wydaje się, że jest to głównie kwestia przymusu typu. Co jest w porządku, po prostu jestem zdezorientowany, dlaczego na ziemi "Get-Member" powiedział mi, że typ to "System.String' –

+0

Edytuję swoją odpowiedź, aby odpowiedzieć na Twój komentarz. – JPBlanc

+0

Oooooh, racja, zawsze zapominam, jak robi to rura. Dang. Przez większość czasu, tym razem, zdezorientowało mnie to wiele godzin. –

6

syn ...

Po dochodzenia wydaje się, że Get-Content zwraca tablicę ciągów. Co jest oczywiście przymuszane do ciągu znaków domyślnie poprzez dołączenie do domyślnego znaku ' '.

To, co jest naprawdę zastanawiające, to dlaczego wyniki są wymuszane przez ciąg znaków na get-member. Ktoś wie, dlaczego tak się stało? Sprawa nie była oczywista, aż wyraźnie zaznaczone Get-Type

W każdym przypadku, rozwiązaniem było odczytać pliku przy użyciu [system.io.file]::ReadAllText('c:\temp\temp.txt') nad Get-Content

+0

tak, automatycznie rozpakowuje tablice i pokazuje typ _type_ tablicy, jeśli ma to sens. – Nacht

+0

użyj '$ var.gettype()', aby powiedzieć, jaki typ zmiennej faktycznie jest – Nacht

+1

'Get-Content -raw' wydaje się również działać. Wymaga PS> = 3. – davidhigh

Powiązane problemy