PowerShell FINDSTR эквивалентен?

Что такое DOS FINDSTR для PowerShell ? Мне нужно найти кучу файлов журнала для "ОШИБКА".

18.08.2008 14:36:49
Есть веб-сайт с хорошей статьей для этого: interactive-sw.co.uk/iangblog/2006/06/03/pshfindstr
Andrew Taylor 18.08.2008 14:45:08
7 ОТВЕТОВ

Вот быстрый ответ

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

Я нашел это здесь, у которого есть большой подробный ответ!

30
7.02.2017 16:40:04
if ($entry.EntryType -eq "Error")

Будучи объектно-ориентированным, вы хотите протестировать данное свойство с помощью одного из стандартных операторов сравнения, которые вы можете найти здесь .

У меня есть сценарий PS, который просматривает журналы удаленно для меня прямо сейчас - некоторые простые изменения должны заставить его работать на вас.

редактировать: я полагаю, я должен также добавить, что это командлет, созданный для этого уже, если вы не хотите развернуть, как я сделал. Проверять, выписываться:

man Get-EventLog
Get-EventLog -newest 5 -logname System -EntryType Error
0
19.08.2008 03:44:37

Например, найдите все экземпляры «#include» в файлах c в этом каталоге и во всех подкаталогах.

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

gci - это псевдоним get-childitem

8
18.08.2008 14:51:13

Просто чтобы расширить ответ Monroecheeseman. gci - это псевдоним для Get-ChildItem (который эквивалентен dir или ls), ключ -r выполняет рекурсивный поиск, а -i означает включение.

Передача результата этого запроса в select-string позволяет ему читать каждый файл и искать строки, соответствующие регулярному выражению (в данном случае это ERROR, но это может быть любое регулярное выражение .NET).

Результатом будет коллекция объектов соответствия, показывающая соответствие строки, файл и другую связанную информацию.

3
18.08.2008 18:22:41

В соответствующей заметке приведен поиск, в котором перечислены все файлы, содержащие определенный поиск или строку регулярного выражения. Это может использовать некоторые улучшения, так что не стесняйтесь работать над этим. Кроме того, если кто-то хочет включить его в функцию, которая будет приветствоваться.

Я новичок здесь, так что, если это будет идти в своей теме, просто дайте мне знать. Я подумал, что скажу это ей, так как это выглядит в основном связанным.

# 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) {$SelectParam=@{AllMatches=$True}}
else {$SelectParam=@{List=$True}}
if ($IncludeSubfolders -eq $True) {$RecurseParam=@{Recurse=$True}}
else {$RecurseParam=@{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
12.09.2012 18:02:22

Это не лучший способ сделать это:

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

Это помогло мне найти все CSV-файлы, в которых был |персонаж.

0
13.02.2014 08:44:40

PowerShell в основном исключает необходимость в findstr.exe, как показывают предыдущие ответы. Любой из этих ответов должен работать нормально.

Однако, если вам действительно нужно использовать findstr.exe (как было в моем случае), вот обертка PowerShell для него:

Используйте -Verboseопцию для вывода командной строки findstr .


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 $_
            }
        }
    }
}
0
6.03.2016 21:13:25