2009-09-28 19 views

cevap

10

İki sorun var. Soruda olduğu gibi, select-string'in "out-string" den elde edilebilecek çıkış dizgisinde çalışması gerekir. Ayrıca, select-string, kendisine bağlanan dizeler üzerinde aynı şekilde işlemez. İşte o zaman Ahmet'in yaklaşımıyla gitmek gerçekten hiç "grep" biçimlendirilmiş çıktı (ekran dizeleri) istiyorsanız genel bir çözüm

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

Powershell 1.0'da -split yoktur. Bunun yerine aşağıdakileri yapabilirsiniz: (diğer adlar-out-string-akış) | select-string Write – Mike

+1

Buradaki noktayı tamamen kaçırmıyor musunuz? Powershell'in çıkışına ihtiyacın yok. – x0n

+2

@ x0n Eh, PS konsolu aracılığıyla bir şeyleri aradığım ve belirli bir özellikte olup olmadığını bilmediğim ve/veya umursamıyorum. 'Get-Üye' kullanmak için çok sıkıcı buluyorum ve daha sonra '' 'komutunda doğru özellik ve ifadeyi kullanın. Ve 'grep' bu konuda özellikle iyi. – OnesimusUnbound

22

Sorununuz, diğer adların, dizeleri yerine bir AliasInfo nesnesi akışı yayınlamasıdır. İstediğimi düşünüyorum.

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

veya boru hattının (sadece 'takma' çalıştırdığımızda gibi), kabuk ToString kullanmayı bilir içinde olan şeyleri ele olmayan bir fonksiyonu

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

alias | grep Alias 

olarak

() her bir nesne üzerinde yöntemini kullanın (veya ETS bilgisinde belirtilen çıkış formatlarını kullanın).

+0

Bunun bir jenerik kısayol programından çıktıda çalıştığını eklemek istedim. Linux'u taklit eder. grep çubuğu istediğim gibi – Sint

27

olduğunu. Bunun işe yaradığı kesin zamanlar vardır. Ancak, PowerShell'in nesne boruhattı doğasını kucaklamayı denemek istiyorsanız, bunu deneyin. örneğin

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> 

Not Get-Alias ​​(takma ad) görüntü çıkışı gördüğünüz bir üstbilgidir Tanımı özelliği: Birincisi, boru hattını aşağı akan nesneler üzerinde özelliklerini kontrol

PS> alias 

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

Genellikle başlık başlığı, özellik adıyla eşleşir, ancak her zaman değil. Get-Üye kullanmanın kullanışlı olduğu yer burasıdır. Size karşı "senaryo" yazmak için gerekenleri gösterir. Şimdi, "grep" i ne istiyorsanız, Tanım özellik içerikleridir, sonra bunu düşünün. Aksine sadece o özelliğin değerini grepping yapmak yerine, bu özelliğin içerikleriyle pipepline her AliasInfo nesnesini kapatabilir ve sen mesela bunu yapmak için bir normal ifade kullanabilirsiniz: Bu örnekte

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 

nerede kullanmak Nesneleri bazı rasgele komutlara göre filtrelemek için -Object cmdlet'i. Bu durumda, regex 'alias' ile eşleştirilen Defintion özelliğine göre filtrelerim. Sadece bu filtre için doğru dönen nesnelerin, boru hattını yaymasına ve ana makine üzerinde görüntülenmek üzere biçimlendirilmesine izin verilir.

BTW bunu yazıyorsanız, Nesne - 'Nerede' veya '?' Için iki takma addan birini kullanabilirsiniz.Örneğin: kullanın

Get-Alias -Definition Write* 
+4

Ayrıca, PowerShell'in sizin için bir metne dönüştürme işlemine başlayacağı 'findstr' özelliğini de kullanabilirsiniz, çünkü bu bir cmdlet değil, bir programdır (yalnızca tamamlanmış durumdadır; genel olarak, özelliklere göre filtrelemek her zaman iyidir, imho :-)) – Joey

+0

FYI , Powershell 3'e göre, daha ayrıntılı: 'gal | Nerede Tanım -match 'alias' ' – tkokasih

+0

Bu yanıtın OP içeriğine değil, başlığa olduğunu hissediyorum. Eğer komutum (örneğin) "pip freeze" ise - çıktı sadece metindir. Roi'nin cevabı, bunun başlığının ne anlama geldiğini gösteriyor. –

4

çözüm önerisi şöyle yapılabilir bir şey için sadece çok çalışmak olduğunu

new-alias grep findstr 
:
alias | findstr -i Write 

Ayrıca grep kelime kullanmak için bir takma ad yapabilir

24

Bence bu çözüm daha kolay ve daha iyidir doğrudan fonksiyon Findstr:

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

Diğer tüm cevaplar arasında en sezgisel ve hatırlanması kolay bir yaklaşımdır. –

0

Daha esnek ve tembel bir çözüm için, nesnelerin tüm özelliklerini eşleştirebilirsiniz. Çoğu zaman, bu size istediğiniz davranışa sahip olmalı ve olmadığı zaman her zaman daha spesifik olabilirsiniz. İşte bu prensibe dayanan bir grep işlevi:

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 
} 
İlgili konular