2009-09-28 14 views

Odpowiedz

10

Występują dwa problemy. Podobnie jak w pytaniu, ciąg znaków musi działać na łańcuchu wyjściowym, który można uzyskać z "wyjścia". Ponadto ciąg-selekcji nie działa w trybie liniowym dla łańcuchów, które są do niego podłączone. Tutaj jest ogólnym rozwiązaniem

(alias|out-string) -split "`n" | select-string Write 
+3

W Powershell 1.0 nie ma opcji -split. Możesz to zrobić zamiast: (alias | out-string -stream) | select-string Napisz – Mike

+1

Czyż nie wszystko tu całkowicie pomijasz? Nie musisz pobierać wyników Powerhell. – x0n

+2

@ x0n No cóż, zdarzają się przypadki, w których szybko przeszukuję coś przez konsolę PS i nie wiem i/lub nie dbam o to, czy jest to konkretna właściwość. Uważam, że zbyt nużące jest używanie 'Get-Member', a następnie użycie poprawnej właściwości i wyrażenia w komendzie' where'. I "grep" jest szczególnie dobry w tym. – OnesimusUnbound

22

Twój problem polega na tym, że alias emituje strumień obiektów AliasInfo, a nie strumień struny w postaci . Robi to, co myślę, że chcesz.

alias | out-string -stream | select-string Alias 

lub jako funkcja

function grep { 
    $input | out-string -stream | select-string $args 
} 

alias | grep Alias 

Kiedy nie obsłużyć rzeczy, które są w rurociągu (jak wtedy, gdy po prostu zabrakło „alias”), powłoka wie użyć toString () metoda na każdym obiekcie (lub użyj formatów wyjściowych określonych w informacjach ETS).

+0

Chciałem tylko dodać, że działa to na wyjściu z ogólnego programu cli. Naśladuje Linux ./foo | grep bar tak jak chciałem – Sint

27

Jeśli naprawdę chcesz „grep” sformatowany wyjściowe (wyświetlanie ciągów), a następnie przejść z podejściem Mike'a. Zdarzają się sytuacje, w których przydaje się to. Jeśli jednak chcesz spróbować zastosować charakter obiektu PowerShell, spróbuj tego. Po pierwsze, sprawdź właściwości dotyczące obiektów spływających rurociągu:

PS> alias | Get-Member 


    TypeName: System.Management.Automation.AliasInfo 

Name    MemberType  Definition 
----    ----------  ---------- 
Equals    Method   bool Equals(System.Object obj) 
GetHashCode   Method   int GetHashCode() 
GetType    Method   type GetType() 
ToString   Method   string ToString() 
<snip> 
*Definition*  Property  System.String Definition {get;} 
<snip> 

Uwaga właściwość Definicja który jest nagłówek widać podczas wyświetlania wyjście Get-Alias ​​(Alias) np:

PS> alias 

CommandType  Name   *Definition* 
-----------  ----   ---------- 
Alias   %    ForEach-Object 
<snip> 

Zazwyczaj tytuł nagłówka pasuje do nazwy właściwości, ale nie zawsze. To tutaj przydaje się używanie Get-Member. Pokazuje, czego potrzebujesz, aby "skryptować" przeciwko. Teraz, jeśli chcesz "grep" to zawartość właściwości Definicja, rozważ to. Zamiast po prostu grepping wartość, że jedna właściwość, można zamiast filtrować każdy obiekt AliasInfo w pipepline przez zawartość tej właściwości można użyć regex to zrobić np

PS> alias | Where-Object {$_.Definition -match 'alias'} 

CommandType  Name     Definition 
-----------  ----     ---------- 
Alias   epal     Export-Alias 
Alias   gal     Get-Alias 
Alias   ipal     Import-Alias 
Alias   nal     New-Alias 
Alias   sal     Set-Alias 

W tym przykładzie używam gdzie -Object cmdlet do filtrowania obiektów na podstawie dowolnego dowolnego skryptu. W tym przypadku filtruję według właściwości Defintion dopasowanej do aliasu wyrażenia regularnego. Tylko te obiekty, które zwracają wartość true dla tego filtru, mogą rozprzestrzeniać się w potoku i zostać sformatowane do wyświetlania na hoście.

BTW, jeśli piszesz to, możesz użyć jednego z dwóch aliasów dla Where-Object - "Where" lub "?".Na przykład:

PS> gal | ?{$_.Definition -match '-Item*'} 
+4

Możesz także użyć 'findstr', gdzie PowerShell będzie obsługiwał konwersję do tekstu dla ciebie, ponieważ nie jest to cmdlet, ale program (tylko poza kompletnością, ogólnie zawsze lepiej filtrować według właściwości, imho :-)) – Joey

+0

FYI , jak w PowerShell 3, poniższe jest bardziej zwięzłe: 'gal | Gdzie Definicja -match 'alias'' – tkokasih

+0

Czuję, że to odpowiada zawartości OP, ale nie tytuł. Jeśli moim poleceniem jest (na przykład) "pip freeze" - wyjście to tylko tekst. Odpowiedź Roi jest tym, co wydaje się oznaczać ten tytuł. –

4

Proponowane rozwiązanie jest po prostu dużo pracy do czegoś, co można zrobić tak:

Get-Alias -Definition Write* 
24

Myślę, że to rozwiązanie jest łatwiejsze i lepsze, należy użyć bezpośrednio ze findstr funkcja:

alias | findstr -i Write 

można także użyć aliasu grep słowo:

new-alias grep findstr 
+0

Jest to najbardziej intuicyjny i łatwy do zapamiętania sposób spośród wszystkich innych odpowiedzi. –

0

Aby uzyskać bardziej elastyczne i leniwe rozwiązanie, można dopasować wszystkie właściwości obiektów. W większości przypadków powinno to zapewnić ci pożądane zachowanie, a zawsze możesz być bardziej konkretny, gdy tego nie chcesz. Oto funkcja grep, która działa w oparciu o tę zasadę:

Function Select-ObjectPropertyValues { 
    param(
    [Parameter(Mandatory=$true,Position=0)] 
    [String] 
    $Pattern, 
    [Parameter(ValueFromPipeline)] 
    $input) 

    $input | Where-Object {($_.PSObject.Properties | Where-Object {$_.Value -match $Pattern} | Measure-Object).count -gt 0} | Write-Output 
} 
Powiązane problemy