2009-09-22 50 views
0

背景:這裏的目標是使用select-string在powershell中執行一些基本命令。出於某種原因,某些事情不能按預期工作。PowerShell選擇的基本語法問題

假設如下:

$vfilter = 'c:/foo/bar/files/*.htm'; 
    Select-String -path $vfilter -pattern ".*DOCTY.*" | 
     sort LineNumber | 
     where-object { $_.Filename -match "02" } | 
     format-list | 
     out-file c:/00junk.txt; 

...如果是這種輸出...

IgnoreCase : True 
    LineNumber : 1 
    Line  : <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "ht 
       tp://www.w3.org/TR/html4/loose.dtd"> 
    Filename : 02junk.htm 
    Path  : C:\ ... \02junk.htm 
    Pattern : .*DOCTY.* 
    Context : 
    Matches : {<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "h 
       ttp://www.w3.org/TR/html4/loose.dtd">} 

問題:

1)如何防止PowerShell與包裝文本「行」和「匹配」 屬性。由於這是發送到 文本文件,我不關心控制檯寬度,因此我不希望任何 文本換行發生。

2)假設我想用一個多行字符串做我自己的自定義輸出。在Ruby (例如)我能做到這一點是這樣的:

custom_string = ''; 
    items.each{|myitem| 
     custom_string += %Q[ 
      ### begin output ### 
      HereIs::LineNumber! --> #{myitem['LineNumber']} 
      HereIs::Path!  --> #{myitem['Path']} 
      This is the actual line (below): 

      #{myitem['Line']} 
     ] 
    } 
    custom_string.tofile('c:/00junk.txt'); 

我怎樣才能獲得PowerShell中做同樣的或類似的事情?

3)我怎麼能做到2)上面有一個powershell here-string?

回答

8

1)爲防止打包,您可以爲Out-File指定一個巨大的width參數。

2)使用ForEach-Object(化名%)來生成字符串:

$vfilter = 'c:/foo/bar/files/*.htm'; 
Select-String -path $vfilter -pattern ".*DOCTY.*" | 
    sort LineNumber | 
    where-object { $_.Filename -match "02" } | 
    ForEach-Object { 
@" 
Line Number: $($_.LineNumber) 
Path:  $($_.Path) 
This is the actual line (below): 

$($_.Line) 

"@ 
    } | 
    out-file c:/00junk.txt;