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
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')
}
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
}
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.
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.