powershell基本语法问题的选择

时间:2009-09-22 18:26:50

标签: string select powershell grep

后台:这里的目标是使用select-string在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包装“Line”和“Matches”的文本 属性。因为这是发送到 文本文件,我不关心控制台宽度因此我不想要任何 文本包装发生。

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)我怎么能用上面的PowerShell here-string做上述2)?

1 个答案:

答案 0 :(得分:8)

1)为防止包装,您可以为width指定一个巨大的Out-File参数。

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;