2009-09-22 14 views
0

Contexte: Ici, le but est de faire quelques commandes de base dans powershell en utilisant select-string. Pour une raison quelconque, il y a certaines choses qui ne fonctionnent pas comme prévu.powershell question de syntaxe de base pour sélectionner

On suppose les éléments suivants:

$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; 

... où cela est la sortie ...

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">} 

Questions:

1) Comment puis-je empêcher powershell d'emballage le texte des propriétés "Line" et "Matches" . Étant donné que cela est envoyé à un fichier texte , je ne me soucie pas de la largeur de la console et par conséquent je ne veux pas de l'habillage de texte à se produire.

2) Supposons que je souhaite créer ma propre sortie personnalisée avec une chaîne multiligne. Dans Ruby (par exemple) que je pouvais le faire comme ceci:

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'); 

Comment puis-je obtenir powershell faire la même chose ou similaire?

3) Comment pourrais-je faire 2) ci-dessus avec une chaîne de PowerShell ici?

Répondre

8

1) Pour éviter l'enrubannage, vous pouvez spécifier un énorme paramètre width pour Out-File.

2) Utilisez ForEach-Object (alias %) pour générer votre chaîne:

$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;