2009-06-29 32 views
8

Câu hỏi đơn giản (có lẽ là ngu ngốc). Tôi là một người mới làm quen với Powershell và chủ yếu sử dụng nó để khởi tạo các thư viện được quản lý để tôi không phải viết các ứng dụng nhỏ khi tôi cần sử dụng các thành viên từ chúng. Một số các thư viện này đã cũ và có các phương pháp với chữ ký dài, đau đớn. Sử dụng get-member sau khi instantiating với new-object, tôi đã thường chạy vào kết quả bực bội như thế này:Có cách nào để kết quả từ vựng của lệnh ghép ngắn Powershell không?

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.... 

Có cách nào để bọc kết quả của get-member? Ngoài ra, có một chuyển đổi cho get-thành viên sẽ sản xuất các kết quả một cách mà sẽ không quấn?

Trả lời

14

Kết quả trong cấu trúc bảng được tự động định dạng để vừa với chiều rộng của màn hình, cắt bớt các giá trị dài trong quá trình nếu cần.

Kết quả đường ống thành lệnh format-list để nhận định dạng chi tiết, theo chiều dọc của kết quả.

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

Đó là một. Cảm ơn! –

+0

tại sao không làm việc này '$ đối tượng | get-childitem env: đường dẫn | định dạng danh sách'? – whytheq

4

Định dạng bảng có công tắc -Wrap để bọc cột cuối cùng. Vì cột cuối cùng của đầu ra của Get-Member là khá lớn, điều này sẽ tạo ra các kết quả có thể đọc được.

lựa chọn khác là Format-Wide (nhưng nó không quấn, vì vậy bạn được giới hạn để an ủi width):

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

Bạn cũng có thể thử định dạng bảng -wrap, như:

(get-process -id 3104) .startinfo.EnvironmentVariables | định dạng bảng -wrap

4

tôi không thể tìm thấy một cái gì đó được xây dựng trong đó đã cho phép word-wrap để có chiều rộng tùy ý, vì vậy tôi đã viết một - một chút dài dòng nhưng ở đây nó là:

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

Tôi nghĩ rằng bạn có nghĩa là để thiết lập lại '$ col' để không bên trong vòng lặp nếu, có? –

2

Building trên câu trả lời của Leo, tôi quyết định tạo một lệnh ghép ngắn 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 
    } 
} 

Nó hoạt động bằng cách đi qua cả một chuỗi hoặc mảng các chuỗi như một đối số chức năng, hoặc trên đường ống. Ví dụ:

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

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

Khối nhận xét siêu dữ liệu ở đầu hàm cho phép get-help word-wrap hiển thị một số thông tin hữu ích. See this page để biết thêm thông tin về cách xác định cmdlets đường ống.

Các vấn đề liên quan