2016-12-05 1 views
0

temps il y a je demande de l'aide pour développer un fichier batch court pour compresser les fichiers à l'intérieur d'un arbre à l'aide 7zip, voir le lien suivant:Sauter dans un « FOR » boucle dans un fichier batch

Compress separately files within subfolders

Maintenant, je vouloir éviter les fichiers déjà compressés (.7z, fichiers .zip) et passer à l'élément suivant.

Je souhaite également supprimer les fichiers compressés précédents (tels que '.7z.7z' ou ' .zip.7z') créés en utilisant plusieurs fois le fichier de commandes d'origine dans un même dossier.

C'est ce que je suis arrivé à ce jour:

@echo off 
cd /d %~dp0 
rem 7z.exe path 
set sevenzip= 
if "%sevenzip%"=="" if exist "%ProgramFiles(x86)%\7-zip\7z.exe" set sevenzip=%ProgramFiles(x86)%\7-zip\7z.exe 

if "%sevenzip%"=="" if exist "%ProgramFiles%\7-zip\7z.exe" set sevenzip=%ProgramFiles%\7-zip\7z.exe 

if "%sevenzip%"=="" echo 7-zip not found&pause&exit 
@echo searching... 
for /R %%I in (*) do (
     if not exist %%I.zip if not exist %%I.7zip "%sevenzip%" a -mx -mmt4 "%%I.7z" -r -x!*.bat "%%I" && "%sevenzip%" t "%%I.7z" * -r 

) 

del "Compressing_files_7zip.bat.7z" 
del *.7z.7z* 
del *.zip.7z* 

::::::::::::::::::::::::::For setting up shutdown 60' after the end of the process.Remove colons in the line below. 
::shutdown.exe /s /t 3600 

pause 

Les principales questions que je reçois avec ce code sont les suivants:

-Je suis incapable de détecter les fichiers déjà compressés et donc passer à la suivante% % I entité.

-Retirez les fichiers non compressés indésirables des sous-dossiers. De toute évidence, le caractère générique '*' ne fonctionne pas dans la boucle; Par contre, si je cherche 'del %% I.7z.7z' ça ne marche pas non plus. J'ai lu que je ne peux pas utiliser une fonction correcte 'OU' pour les boucles 'if', c'est pourquoi je les ai imbriquées.

Merci à l'avance.

Alex.

Répondre

0
for /R %%I in (*) do (
     if not exist %%I.zip if not exist %%I.7zip "%sevenzip%" a -mx -mmt4 "%%I.7z" -r -x!*.bat "%%I" && "%sevenzip%" t "%%I.7z" * -r 

) 

Notez que %%I contiendra le complet nom de fichier, donc si vous trouvez whatever.zip alors le code recherche whatever.zip **. ** zip ou whatever.zip **. ** 7zip et exécutera le 7zip si deux de ceux-ci sont absents et whatever.zip ** génèrent. 7z **

donc si vous trouvez whichever.txt alors le code recherche whichever.txt **. ** zip ou whichever.txt ** .7zip ** et exécutera le 7zip si les deux parmi ceux-ci sont un bsent et générer whichever.txt **. ** 7z

Je vous suggère

for /R %%I in (*) do (
    if not exist %%~nI.zip if not exist %%~nI.7z "%sevenzip%" a -mx -mmt4 "%%~nI.7z" -r -x!*.bat "%%I" && "%sevenzip%" t "%%~nI.7z" * -r 

) 

qui devrait choisir la name seulement une partie du nom du fichier. (Voir for /?|more de l'invite pour Docco)

Par conséquent, le code rechercherait whatever.zip ou whatever.7z - trouve whatever.zip et ne pas exécuter 7zip

ou, pour whichever.txt, le code rechercherait whichever.zip ou whichever.7z - ne trouve ni et exécute 7zip génération maintenant whichever.7z

, puisque whichever.7z existe, d'autres pistes vont sauter le 7zip.

Ce qui soulève la question - si le fichier zip/7z existe, pourquoi ne pas essayer de rafraîchir l'archive, puisque le fichier détecté peut avoir changé?

+0

Merci Magoo. Le code ignore les fichiers compressés mais aussi les fichiers à double extension (il peut y avoir de tels fichiers). De plus, je suppose que selon la syntaxe que je propose, les fichiers zippés ne sont plus créés sur le dossier source au lieu qu'ils apparaissent là où je place le fichier batch. Répondre à votre question: Parce que cela compresserait à nouveau les fichiers volumineux qui n'ont pas changé (s'il y a un changement, il deviendrait 'v2' ou plus) et ce n'est pas souhaitable. –

+0

Laissez-moi vous suggérer de citer comme si «n'existe pas» %% ~ nI.zip «si n'existe pas» %% ~ nI.7z "' ... – aschipfl

+0

@aschipfl TY mais je ne l'ai pas fait fonctionner. Quoi qu'il en soit, je dois travailler sur le nom du fichier et m'assurer que la compression se produit dans le dossier source. –