后台:这里的目标是使用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)?
答案 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;