web-dev-qa-db-fra.com

Parcourez les fichiers d'un répertoire à l'aide de PowerShell

Comment puis-je modifier le code suivant pour examiner tous les fichiers .log du répertoire et pas seulement le fichier?

Je dois parcourir tous les fichiers et supprimer toutes les lignes qui ne contiennent pas "step4" ou "step9". Actuellement, cela créera 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 suit: 2013 09 03 00_01_29.log. Je voudrais que les fichiers de sortie les écrase ou que le nom SAME soit ajouté avec "out".

$In = "C:\Users\gerhardl\Documents\My Received Files\Test_In.log"
$Out = "C:\Users\gerhardl\Documents\My Received Files\Test_Out.log"
$Files = "C:\Users\gerhardl\Documents\My Received Files\"

Get-Content $In | Where-Object {$_ -match 'step4' -or $_ -match 'step9'} | `
Set-Content $Out
206
user2725402

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')
}
313
Shay Levy

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 parcourir 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
}

Une méthode encore plus simple consiste à utiliser la boucle foreach (grâce à @Soapy et @MarkSchultheiss):

foreach ($f in $files){
    $outfile = $f.FullName + "out" 
    Get-Content $f.FullName | Where-Object { ($_ -match 'step4' -or $_ -match 'step9') } | Set-Content $outfile
}
64
PVitt

Si vous avez besoin de boucler de manière récursive dans un répertoire pour un type de fichier particulier, utilisez la commande ci-dessous, qui filtre tous les fichiers de type doc.

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

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

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

Maintenant, la variable $fileNames agit comme un tablea à partir duquel vous pouvez effectuer une boucle et appliquer votre logique métier.

23
Sarath Avanavu