Obter lista de arquivos que correspondem / não correspondem a uma consulta no Windows

0

Eu tenho uma árvore de diretórios que contém ~ 150 arquivos com uma extensão específica ( .php ) organizada em diferentes pastas. Alguns desses arquivos são marcados na linha 2 para indicar um determinado status. Eu sei que esta marca está sempre na linha 2, e segue sempre um formato específico.

O que eu estou procurando é algo (um comando, um script, um programa) que pode pesquisar o diretório por essa marca e me dar uma saída como essa, mas em um formato fácil de manipular:

UmasoluçãoidealseriaaquelaquepodefornecerumalistadeTODOSosarquivos.php,comalinha2doarquivoaoladodonomedoarquivo.Alistaacimafazissoapenasparaarquivoscorrespondentes.

Eutenteiusarfindemumloopfor:

for%fin(*.php)dofind"Oracle Status" %f

Mas isso só pesquisa o diretório atual e não o formata de maneira amigável.

    
por cyberbit 15.06.2016 / 21:04

1 resposta

1

Se você está bem com o uso do PowerShell, esse script deve fazer o trabalho:

Get-ChildItem *.php -Recurse | ForEach-Object {
 $lines = Get-Content $_ -TotalCount 2
 If ($lines.Length -GT 1 -And $lines[1].Length -GT 1 -And $lines[1].Contains('Oracle Status:')) {
  New-Object -TypeName PSObject -Prop @{'FilePath' = $_.FullName; 'StatusLine' = $lines[1]}
 }
}

Produz saída semelhante a esta no console:

A versão mostrada aqui procurou por .txt arquivos com uma linha Status: , mas o que foi colado acima faz o que você quer.

Salve o script como um arquivo .ps1 , por exemplo %código%. Se você nunca executou um script do PowerShell antes, será necessário executar esse comando uma vez para permitir a execução de scripts:

Set-ExecutionPolicy Unrestricted -Scope CurrentUser

Depois disso, você pode invocar o script em um prompt do PowerShell digitando phpstatus.ps1 seguido de seu nome, por exemplo, %código%. (A conclusão da tabulação funciona.) Como a saída é uma coleção de objetos do PowerShell, você pode usar comandos de gerenciamento de dados padrão do PowerShell neles.

    
por 15.06.2016 / 21:38