2008-08-18 4 views
19

PowerShellのDOS FINDSTRに相当するものは何ですか?私は "ERROR"のためにたくさんのログファイルを検索する必要があります。ここでPowerShell FINDSTR eqivalent?

+1

:http://www.interact-sw.co.uk/iangblog/2006/06/03/pshfindstr –

答えて

23

は、迅速な答え

Get-ChildItem -Recurse -Include *.log | select-string ERROR 

は、私はそれを素晴らしい徹底的な答えを持っているhereを見つけたのです!

0
if ($entry.EntryType -eq "Error") 

はオブジェクト指向なので、あなたがhere見つけることができる標準的な比較演算子のいずれかとの質問にプロパティをテストしたいです。

私はPS scriptのログを今すぐ遠慮なく閲覧しています。簡単な変更が必要な場合は、簡単に修正する必要があります。

編集:私が行ったやり方を展開したくない場合は、これも既に作成済みのコマンドレットです。例えば

man Get-EventLog 
Get-EventLog -newest 5 -logname System -EntryType Error 
7

、このディレクトリ内のCファイルとすべてのサブディレクトリに「の#include」のすべてのインスタンスを検索する:チェックしてください。

gci -r -i *.c | select-string "#include" 

GCIただMonroecheesemanの答えを拡張するには、Get-ChildItemコマンドレット

3

の別名です。 gciはGet-ChildItem(dirまたはlsと同等)のエイリアスです。-rスイッチは再帰的検索を行い、-iはインクルードを意味します。

select-stringにそのクエリの結果をパイプすると、各ファイルが読み込まれ、正規表現に一致する行が検索されます(この例ではERRORが指定されていますが、任意の.NET正規表現が使用できます)。

結果は、行の一致、ファイル、およびその他の関連情報を示す一致オブジェクトのコレクションになります。

0

関連するノートでは、特定の正規表現検索または文字列を含むすべてのファイルを一覧表示する検索を示します。それはいくつかの改善を使用することができますので、自由にそれに取り組む。また、誰かがそれを歓迎する関数にカプセル化したいと思った場合。

私はここにいるので、これが自分自身の話題になるなら、私に知らせてください。これはほとんど関係があるように見えるので、私は彼女にそれを置くと思った。

# Search in Files Script 
# ---- Set these before you begin ---- 
$FolderToSearch="C:\" # UNC paths are ok, but remember you're mass reading file contents over the network 
$Search="Looking For This" # accepts regex format 
$IncludeSubfolders=$True #BUG: if this is set $False then $FileIncludeFilter must be "*" or you will always get 0 results 
$AllMatches=$False 
$FileIncludeFilter="*".split(",") # Restricting to specific file types is faster than excluding everything else 
$FileExcludeFilter="*.exe,*.dll,*.wav,*.mp3,*.gif,*.jpg,*.png,*.ghs,*.rar,*.iso,*.zip,*.vmdk,*.dat,*.pst,*.gho".split(",") 

# ---- Initialize ---- 
if ($AllMatches -eq $True) {[email protected]{AllMatches=$True}} 
else {[email protected]{List=$True}} 
if ($IncludeSubfolders -eq $True) {[email protected]{Recurse=$True}} 
else {[email protected]{Recurse=$False}} 

# ---- Build File List ---- 
#$Files=Get-Content -Path="$env:userprofile\Desktop\FileList.txt" # For searching a manual list of files 
Write-Host "Building file list..." -NoNewline 
$Files=Get-ChildItem -Include $FileIncludeFilter -Exclude $FileExcludeFilter -Path $FolderToSearch -ErrorAction silentlycontinue @RecurseParam|Where-Object{-not $_.psIsContainer} # @RecurseParam is basically -Recurse=[$True|$False] 
#$Files=$Files|Out-GridView -PassThru -Title 'Select the Files to Search' # Manually choose files to search, requires powershell 3.0 
Write-Host "Done" 

# ---- Begin Search ---- 
Write-Host "Searching Files..." 
$Files| 
    Select-String $Search @SelectParam| #The @ instead of $ lets me pass the hastable as a list of parameters. @SelectParam is either -List or -AllMatches 
    Tee-Object -Variable Results| 
    Select-Object Path 
Write-Host "Search Complete" 
#$Results|Group-Object path|ForEach-Object{$path=$_.name; $matches=$_.group|%{[string]::join("`t", $_.Matches)}; "$path`t$matches"} # Show results including the matches separated by tabs (useful if using regex search) 

<# Other Stuff 
    #-- Saving and restoring results 
    $Results|Export-Csv "$env:appdata\SearchResults.txt" # $env:appdata can be replaced with any UNC path, this just seemed like a logical place to default to 
    $Results=Import-Csv "$env:appdata\SearchResults.txt" 

    #-- alternate search patterns 
    $Search="(\d[-|]{0,}){15,19}" #Rough CC Match 
#> 
0

これは、これを行うための最善の方法ではありません。

gci <the_directory_path> -filter *.csv | where { $_.OpenText().ReadToEnd().Contains("|") -eq $true } 

これは私が彼らに|文字を持っていたすべてのCSVファイルを見つける助けました。

0

PowerShellは、基本的にfindstr.exeの必要性を排除しています。これらの回答のどれもうまくいくはずです。

ただし、実際にfindstrを使用する必要がある場合はです。exeファイル(私の場合のように)、ここではそれのためのPowerShellラッパーです:

は出力にFINDSTRコマンドラインを-Verboseオプションを使用します。このために良い記事でウェブサイトがあります


function Find-String 
{ 
    [CmdletBinding(DefaultParameterSetName='Path')] 
    param 
    (
     [Parameter(Mandatory=$true, Position=0)] 
     [string] 
     $Pattern, 

     [Parameter(ParameterSetName='Path', Mandatory=$false, Position=1, ValueFromPipeline=$true)] 
     [string[]] 
     $Path, 

     [Parameter(ParameterSetName='LiteralPath', Mandatory=$true, ValueFromPipelineByPropertyName=$true)] 
     [Alias('PSPath')] 
     [string[]] 
     $LiteralPath, 

     [Parameter(Mandatory=$false)] 
     [switch] 
     $IgnoreCase, 

     [Parameter(Mandatory=$false)] 
     [switch] 
     $UseLiteral, 

     [Parameter(Mandatory=$false)] 
     [switch] 
     $Recurse, 

     [Parameter(Mandatory=$false)] 
     [switch] 
     $Force, 

     [Parameter(Mandatory=$false)] 
     [switch] 
     $AsCustomObject 
    ) 

    begin 
    { 
     $value = $Pattern.Replace('\', '\\\\').Replace('"', '\"') 

     $findStrArgs = @(
      '/N' 
      '/O' 
      @('/R', '/L')[[bool]$UseLiteral] 
      "/c:$value" 
     ) 

     if ($IgnoreCase) 
     { 
      $findStrArgs += '/I' 
     } 

     function GetCmdLine([array]$argList) 
     { 
      ($argList | foreach { @($_, "`"$_`"")[($_.Trim() -match '\s')] }) -join ' ' 
     } 
    } 

    process 
    { 
     $PSBoundParameters[$PSCmdlet.ParameterSetName] | foreach { 
      try 
      { 
       $_ | Get-ChildItem -Recurse:$Recurse -Force:$Force -ErrorAction Stop | foreach { 
        try 
        { 
         $file = $_ 
         $argList = $findStrArgs + $file.FullName 

         Write-Verbose "findstr.exe $(GetCmdLine $argList)" 

         findstr.exe $argList | foreach { 
          if (-not $AsCustomObject) 
          { 
           return "${file}:$_" 
          } 

          $split = $_.Split(':', 3) 

          [pscustomobject] @{ 
           File = $file 
           Line = $split[0] 
           Column = $split[1] 
           Value = $split[2] 
          } 
         } 
        } 
        catch 
        { 
         Write-Error -ErrorRecord $_ 
        } 
       } 
      } 
      catch 
      { 
       Write-Error -ErrorRecord $_ 
      } 
     } 
    } 
} 
関連する問題