Comecei a aprender PowerShell há alguns dias e não consegui encontrar nada no Google que fizesse o que eu precisava. Por isso, aceite minha pergunta.
Me pediram para substituir algumas seqüências de texto em vários arquivos. Não sei necessariamente a extensão dos possíveis arquivos de destino e também não sei a localização deles. Até agora, consegui navegar recursivamente no diretório ( get-ChildItem -recurse
) e encontrar a string que estava procurando com get-content e select-string:
Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"
O problema é que posso ver as ocorrências do texto que estou procurando, mas não sei como dizer ao PS para retornar o caminho e o nome de todos os arquivos correspondentes.
Como posso obter o nome e o local dos arquivos que contêm a expressão que estou procurando?
Respostas:
Isso deve fornecer a localização dos arquivos que contêm seu padrão:
fonte
name
parâmetro. Tente adicionar| %{Move-Item $_.name <destination>}
Get-ChildItem -Recurse | Select-String "dummy" -List | Select Path
retorna apenas a primeira correspondência para cada arquivo, portanto, pode ser um pouco mais eficiente e evita a necessidade de agrupá-lostxt
os arquivos, se você usarGet-ChildItem -Recurse -Filter *.txt
em vezforeach
loop, se estiver fazendo grandes operações como essa. Torna-se muito complicado quando você tenta fazer tudo isso em uma linha e é muito fácil cometer um grande erro. Falo por experiênciaHá várias respostas precisas aqui, mas aqui está o código mais conciso para várias variações diferentes. Para cada variação, a linha superior mostra a sintaxe completa e a parte inferior mostra a sintaxe concisa.
O item (2) é uma forma mais concisa das respostas de Jon Z e manojlds, enquanto o item (1) é equivalente às respostas de vikas368 e buygrush.
Listar objetos FileInfo para todos os arquivos que contêm padrão:
Listar nomes de arquivos para todos os arquivos que contêm padrão:
Listar objetos FileInfo para todos os arquivos que não contêm padrão:
Listar nomes de arquivos para todos os arquivos que não contêm padrão:
fonte
-List
parâmetro deSelect-String
Isso exibirá o caminho, o nome do arquivo e a linha de conteúdo encontrada que corresponde ao padrão.
fonte
Canalize o conteúdo do seu
para
fl *
Você verá que o caminho já está sendo retornado como uma propriedade dos objetos.
Se você quiser apenas o caminho, use
select path
ouselect -unique path
para remover duplicatas:fonte
-File
opçãoGet-ChildItem
ou acaba com uma cascata interminável de erros ao tentar chamarGet-Content
diretórios.(Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy").FullName
As pessoas parecem esquecer que o PowerShell é orientado a objetos; em caso de dúvida, procure um imóvelÉ assim que eu faria, você não precisa de conteúdo:
ou
Para ver quais são as diferentes propriedades ...
Isso é mais rápido. O segundo argumento é -filter:
fonte
select Pattern, LineNumber, Filename
para saída mais concisa. Linha retorna TUDO na linha que contém sua sequência de padrões. Você também pode enviar isso facilmente para um CSV, se desejar.Isso fornecerá todos os detalhes de todos os arquivos
fonte
-r
funcionava. Achei que você sempre deveria fazer #-Recurse
Para manter os detalhes completos do arquivo na matriz resultante, você pode usar uma leve modificação da resposta postada por vikas368 (que não parece funcionar bem com o preenchimento automático do ISE):
ou em resumo:
fonte
Se você pesquisar em um diretório, poderá fazê-lo:
fonte
Isso exibirá uma lista do caminho completo para cada arquivo que contém a string de pesquisa:
Observe que ele não exibe um cabeçalho acima dos resultados e não exibe as linhas de texto que contêm a string de pesquisa. Tudo o que você diz é onde você pode encontrar os arquivos que contêm a string.
fonte
Modifiquei uma das respostas acima para me dar um pouco mais de informação. Isso me poupou de uma segunda consulta mais tarde. Era algo assim:
Eu posso especificar o caminho e os curingas de arquivo com essas estruturas, e ele salva o nome do arquivo, o número da linha e a linha relevante em um arquivo de saída.
fonte