2009-06-29 3 views
8

Semplice (probabilmente stupida) domanda. Sono un debuttante di Powershell e lo sto principalmente utilizzando per istanziare le librerie gestite, quindi non devo scrivere piccole app quando ho bisogno di usare membri da loro. Alcune di queste librerie sono vecchie e hanno metodi con firme lunghe e dolorose. Utilizzando get-member dopo un'istanza con il nuovo oggetto, ho spesso incontrato risultati frustranti come questo:Esiste un modo per visualizzare a capo i risultati di un cmdlet di PowerShell?

PS> $object | get-member MethodWithLongSignature 

TypeName: SomeLib.SomeObject 

Name      MemberType Definition 
----      ---------- ---------- 
MethodWithLongSignature Method  System.Void MethodWithLongSignature(string param1, int param2, string param3, string param4, stri.... 

Esiste un modo per avvolgere i risultati di get-member? In alternativa, c'è un interruttore per ottenere membro che produrrà i risultati in un modo che non si avvolgerà?

risposta

14

L'output nelle strutture di tabella viene formattato automaticamente per adattarsi alla larghezza dello schermo, troncando i valori lunghi nel processo se necessario.

Immettere i risultati nel comando format-list per ottenere una formattazione verticale dettagliata dei risultati.

PS> $object | get-member MethodWithLongSignature | format-list 
+0

Questo è quello. Grazie! –

+0

perché non funziona '$ oggetto | get-childitem env: percorso | format-list'? – whytheq

4

Format-Table ha un -Winter per avvolgere l'ultima colonna. Poiché l'ultima colonna dell'output di Get-Member è già abbastanza grande, ciò produrrà risultati leggibili.

Un'altra opzione è Format-Wide (ma non va a capo, quindi si sono limitati a consolare larghezza):

Get-Process | Get-Member | Format-Wide Definition -Column 1 
1

Si può anche provare format-table -wrap, come:

(get-process -id 3104) .startinfo.EnvironmentVariables | format-table -wrap

4

non riuscivo a trovare qualcosa di costruito in quel permesso a word-wrap per una larghezza arbitraria, così ho scritto uno - un po 'prolisso, ma qui è:

function wrapText($text, $width=80) 
{ 
    $words = $text -split "\s+" 
    $col = 0 
    foreach ($word in $words) 
    { 
     $col += $word.Length + 1 
     if ($col -gt $width) 
     { 
      Write-Host "" 
      $col = $word.Length + 1 
     } 
     Write-Host -NoNewline "$word " 
    } 
} 
+0

Penso che intendevi resettare '$ col' a zero all'interno del ciclo if, sì? –

2

costruzione sulla risposta di Leo, ho deciso di creare un cmdlet word-wrap.

<# 
.SYNOPSIS 
wraps a string or an array of strings at the console width without breaking within a word 
.PARAMETER chunk 
a string or an array of strings 
.EXAMPLE 
word-wrap -chunk $string 
.EXAMPLE 
$string | word-wrap 
#> 
function word-wrap { 
    [CmdletBinding()] 
    Param(
     [parameter(Mandatory=1,ValueFromPipeline=1,ValueFromPipelineByPropertyName=1)] 
     [Object[]]$chunk 
    ) 
    PROCESS { 
     $Lines = @() 
     foreach ($line in $chunk) { 
      $str = '' 
      $counter = 0 
      $line -split '\s+' | %{ 
       $counter += $_.Length + 1 
       if ($counter -gt $Host.UI.RawUI.BufferSize.Width) { 
        $Lines += ,$str.trim() 
        $str = '' 
        $counter = $_.Length + 1 
       } 
       $str = "$str$_ " 
      } 
      $Lines += ,$str.trim() 
     } 
     $Lines 
    } 
} 

Funziona sia facendo passare una stringa o array di stringhe come argomento di funzione, o sulla tubazione. Esempi:

$str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " * 5 

word-wrap $str 
$str | word-wrap 
get-content txtfile.txt | ?{ $_ } | sort | word-wrap 

Il commento al blocco dei metadati nella parte superiore della funzione permette get-help word-wrap per mostrare alcune informazioni utili. See this page per ulteriori informazioni sulla definizione dei cmdlet della pipeline.