J'essaie de trouver un moyen pour qu'un script batch écrase chaque instance d'un fichier d'octet différent de zéro à l'intérieur d'un répertoire spécifique et de ses sous-dossiers. Je suppose que puisque je recherche un fichier non nul, je pourrais probablement le boucler avec un échappement s'il ne trouve aucun fichier de taille non nulle?

Exemple, écrasez chaque instance de example.txt où il s'agit d'une taille de fichier non nulle :

D:\
\---SubFolder1
    |   example.txt <10 bytes>
    |
    \---Subfolder2
        |   example.txt <0 bytes>
        |
        \---Subsubfolder1
                example.txt <20 bytes>

Dans l'exemple, D:\Subfolder1\example.txt et D:\Subfolder2\Subsubfolder1\example.txt seraient écrasés, mais D:\Subfolder2\example.txt ne serait pas modifié.

Merci à @NiKiZe pour toute votre aide !

Code de travail :

@ECHO OFF

SET DPATH=%~dp0

FOR /R "%DPATH%" %%F IN (*** SEE BELOW) DO IF %%~zF GTR NEQ 0 CALL :NonEmptyFile "%%~F"
GOTO :EOF

:NonEmptyFile
ECHO Got non empty file: %1
CALL :EOF

*** Remplacez par le nom de fichier que vous souhaitez remplacer, assurez-vous d'utiliser un seul caractère générique quelque part (je l'ai utilisé dans l'extension - par exemple, si je recherche example.txt, j'ai remplacé le * par example.t ?t)

answer

Lot minimal qui parcourt un chemin donné et tous les sous-fichiers et sous-chemins, appelant l' NonEmptyFileétiquette pour chaque fichier non vide.

@ECHO OFF

SET DPATH=%~dp0

FOR /R "%DPATH%" %%F IN (*) DO IF %%~zF GTR 0 CALL :NonEmptyFile "%%~F"
GOTO :EOF

:NonEmptyFile
  ECHO Got non empty file: %1
CALL :EOF

En utilisant %~1dans la fonction, il sera étendu et vous pouvez utiliser quelque chose comme COPY /Y "somefile.txt" "%~1" Comment vous voulez écraser les fichiers n'a pas été spécifié.

Une autre option pour créer des "fichiers vides" est ECHO. > "%~1"

Explication:

  • FOR /R "%DPATH%" %%F IN (*) DO parcourt chaque fichier
  • IF %%~zF GTR 0 si la taille du fichier est supérieure à ...
  • CALL :NonEmptyFile "%%~F"Appelez l' :NonEmptyFileétiquette avec le nom de fichier échappé

Pour tester cela à l'invite, utilisez FOR /R "D:\SubFolder1\" %F IN (*) DO IF %~zF GTR 0 ECHO NonEmptyFile "%~F"

Plus d'informations sur le forfonctionnement sont données en courant for /?danscmd