Parcourir les fichiers dans un répertoire à L'aide de PowerShell

Comment puis-je changer le code suivant pour regarder tous les .les fichiers journaux dans le répertoire, et pas seulement un seul fichier?

Je dois parcourir tous les fichiers et supprimer toutes les lignes qui ne contiennent pas "step4" ou "step9". Actuellement, cela va créer un nouveau fichier, mais je ne sais pas comment utiliser la boucle for each ici (débutant).

Les fichiers réels sont nommés comme ceci: 2013 09 03 00_01_29.log. Je voudrais que les fichiers de sortie les écrasent ou que le même nom soit ajouté avec "out".

$In = "C:UsersgerhardlDocumentsMy Received FilesTest_In.log"
$Out = "C:UsersgerhardlDocumentsMy Received FilesTest_Out.log"
$Files = "C:UsersgerhardlDocumentsMy Received Files"

Get-Content $In | Where-Object {$_ -match 'step4' -or $_ -match 'step9'} | `
Set-Content $Out
164
demandé sur Peter Mortensen 2013-09-17 14:16:37

4 réponses

Essayez ceci:

Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files" -Filter *.log | 
Foreach-Object {
    $content = Get-Content $_.FullName

    #filter and save content to the original file
    $content | Where-Object {$_ -match 'step[49]'} | Set-Content $_.FullName

    #filter and save content to a new file 
    $content | Where-Object {$_ -match 'step[49]'} | Set-Content ($_.BaseName + '_out.log')
}
254
répondu Shay Levy 2016-03-22 13:59:55

Pour obtenir le contenu d'un répertoire, vous pouvez utiliser

$files = Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files\"

Ensuite, vous pouvez également faire une boucle sur cette variable:

for ($i=0; $i -lt $files.Count; $i++) {
    $outfile = $files[$i].FullName + "out" 
    Get-Content $files[$i].FullName | Where-Object { !($_ -match 'step4' -or $_ -match 'step9') } | Set-Content $outfile
}
48
répondu PVitt 2013-09-17 11:23:47

Si vous devez faire une boucle récursive dans un répertoire pour un type de fichier particulier, utilisez la commande ci-dessous, qui filtre tous les fichiers de doc Type de fichier

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc

Si vous devez effectuer le filtrage sur plusieurs types, utilisez la commande ci-dessous.

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc,*.pdf

Maintenant, la variable $fileNames agit comme un tableau à partir duquel vous pouvez boucler et appliquer votre logique métier.

14
répondu Sarath Avanavu 2016-04-28 15:23:59

Les autres réponses sont géniales, je veux juste ajouter... une approche différente utilisable dans PowerShell: Installez GnuWin32 utils et utilisez grep pour afficher les lignes / rediriger la sortie vers le fichier http://gnuwin32.sourceforge.net/

Cela écrase le nouveau fichier à chaque fois:

grep "step[49]" logIn.log > logOut.log 

Cela ajoute la sortie du journal, au cas où vous écraseriez le fichier de connexion et souhaiteriez conserver les données:

grep "step[49]" logIn.log >> logOut.log 

Remarque: Pour pouvoir utiliser GnuWin32 utils globalement, vous devez ajouter le dossier bin à votre système chemin.

0
répondu user1628658 2015-05-11 08:42:49