HDI Powershell: Si détecter ligne dans le fichier, puis supprimer le fichier associé

1

J'essaie de supprimer une énorme quantité de fichiers JPEG corrompus d'une bibliothèque d'images. En utilisant jpegsnoop.exe, j'ai créé un fichier [$ jpgname.txt] pour chaque image. Les jpeg corrompus auront "ERROR" quelque part dans le fichier jpgname.txt.

Jusqu'à présent, je peux détecter tous les fichiers .txt qui signalent les mauvais fichiers avec les éléments suivants:

gci ./ "* .txt" | Select-String-pattern "ERROR" | Format-Table -GroupBy Path

Il génère quelque chose comme ceci pour chaque fichier détecté (il y en a des milliers):

Path: H:\library\001.AE3923.jpg.txt

IgnoreCase     LineNumber Line           Filename       Path           Pattern        Context        Matches
----------     ---------- ----           --------       ----           -------        -------        -------
     True            285     ERROR: ... 001.AE3923.... H:\library... ERROR                         {ERROR}
     True            286 *** ERROR: ... 001.AE3923.... H:\library... ERROR                         {ERROR}
     True            287 *** ERROR: ... 001.AE3923.... H:\library... ERROR                         {ERROR}
     True            288 *** ERROR: ... 001.AE3923.... H:\library... ERROR                         {ERROR}
     True            290 *** ERROR: ... 001.AE3923.... H:\library... ERROR                         {ERROR}
     True            291 *** ERROR: ... 001.AE3923.... H:\library... ERROR                         {ERROR}
     True            292 *** ERROR: ... 001.AE3923.... H:\library... ERROR                         {ERROR}
     True            294 *** ERROR: ... 001.AE3923.... H:\library... ERROR                         {ERROR}
     True            295 *** ERROR: ... 001.AE3923.... H:\library... ERROR                         {ERROR}
     True            296 *** ERROR: ... 001.AE3923.... H:\library... ERROR                         {ERROR}
     True            298 *** ERROR: ... 001.AE3923.... H:\library... ERROR                         {ERROR}
     True            299 *** ERROR: ... 001.AE3923.... H:\library... ERROR                         {ERROR}
     True            301 *** ERROR: ... 001.AE3923.... H:\library... ERROR                         {ERROR}
     True            302 *** ERROR: ... 001.AE3923.... H:\library... ERROR                         {ERROR}
     True            304   ERROR: Ex... 001.AE3923.... H:\library... ERROR                         {ERROR}
     True            307     ERROR: ... 001.AE3923.... H:\library... ERROR                         {ERROR}

La question qui se pose est la suivante: comment puis-je supprimer le fichier renvoyé dans la ligne "Chemin" ET son équivalent en jpeg? En d’autres termes, supprimer H: \ bibliothèque \ 001.AE3923.jpg.txt et H: \ bibliothèque \ 001.AE3923.jpg pour chaque fichier renvoyé par le fichier gci / grep.

Je vous remercie.

Réponse à EBGreen:

Merci d'avoir répondu: C'est beaucoup plus proche. J'obtiens cependant les erreurs suivantes:

Remove-Item : Cannot bind argument to parameter 'Path' because it is null.
At line:1 char:171
+ gci ./ "*.txt" | Select-String -pattern "ERROR" | %{$txtFile = Get-Item $_.Path; $jpgFile = Get-Item ('{0}\{1}' -f $t
xtFile.DirectoryName, $txtFile.BaseName); Remove-Item <<<<  $jpgFile; Remove-Item $txtFile}
    + CategoryInfo          : InvalidData: (:) [Remove-Item], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.RemoveItemC
   ommand

Remove-Item : Cannot remove item H:\library\0010712x1024.jpg.txt: **The process cannot acces
s the file 'H:\library\0010712x1024.jpg.txt' because it is being used by another process.**
At line:1 char:193
+ gci ./ "*.txt" | Select-String -pattern "ERROR" | %{$txtFile = Get-Item $_.Path; $jpgFile = Get-Item ('{0}\{1}' -f $t
xtFile.DirectoryName, $txtFile.BaseName); Remove-Item $jpgFile; Remove-Item <<<<  $txtFile}
    + CategoryInfo          : WriteError: (H:\library\__I...12x1024.jpg.txt:FileInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item H:\library\0010_54165.jpg.txt: The process cannot access
the file 'H:\library\0010_54165.jpg.txt' because it is being used by another process.
At line:1 char:193
+ gci ./ "*.txt" | Select-String -pattern "ERROR" | %{$txtFile = Get-Item $_.Path; $jpgFile = Get-Item ('{0}\{1}' -f $t
xtFile.DirectoryName, $txtFile.BaseName); Remove-Item $jpgFile; Remove-Item <<<<  $txtFile}
    + CategoryInfo          : WriteError: (H:\library\__I...0_54165.jpg.txt:FileInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Utilisateur 92873492834
la source
Donc, quelques erreurs indiquent que les fichiers sont verrouillés par un autre processus. Le premier indique qu'il y a un problème avec le chemin \ nom_fichier en cours de construction. Étant donné que les erreurs de verrouillage de fichier indiquent probablement des noms de fichier valides, je dirais que le code est correct ou proche de celui-ci.
EBGreen
Je ne suis pas sûr, mais puisque j'ai fermé tout le reste qui parle à ce répertoire et que je reçois toujours les mêmes résultats, je pense que powershell lui-même pourrait verrouiller les fichiers (avec les commandes précédentes). Avez-vous entendu parler de cela? Merci.
Utilisateur 92873492834
Je n'ai pas entendu parler de cela, mais souvent le comportement de Windows est un mystère pour nous tous ...
EBGreen

Réponses:

0

essaye ça:

gci ./ "*.txt" | Select-String -pattern "ERROR" | %{$txtFile = Get-Item $_.Path; $jpgFile = Get-Item ('{0}\{1}' -f $txtFile.DirectoryName, $txtFile.BaseName); Remove-Item $jpgFile; Remove-Item $txtFile}
EBGreen
la source
Correction: la réponse que vous avez fournie est de supprimer les fichiers corrompus comme prévu. Je ne sais pas pourquoi il y a des erreurs de lancer (donc je les ai supprimées tôt les premières fois), mais à y regarder de plus près, il fait ce qu'il est censé faire.
Utilisateur 92873492834
Je ne peux pas expliquer les erreurs, mais ça marche vraiment. Merci de votre aide!
Utilisateur 92873492834