Utilisation d'un fichier batch pour compresser des fichiers en tant que fichiers zip individuels


10

J'essaie donc d'utiliser 7zip dans un fichier de commandes pour prendre les fichiers dans un dossier et les compresser en tant que fichiers individuels. Ainsi, le premier fichier obtient sa propre archive zip, et le suivant et ainsi de suite. J'ai regardé sur Internet et essayé un tas de codes différents. Jusqu'à présent, je n'ai réussi à les compresser qu'en un seul fichier zip et à les exporter sur mon bureau.

Malheureusement, j'ai perdu le code qui a fait ça, et maintenant je suis coincé avec ce qui ne semble rien faire.

@echo on
cd "C:\Users\MVD21\Desktop\test"
FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"
pause

Je veux que chaque fichier ait sa propre archive zip, et que l'archive zip partage le nom du fichier, moins l'extension bien sûr.

Toute aide est grandement appréciée.


De plus, s'il existe un moyen plus facile de le faire en utilisant la fonction zip intégrée sur Windows 10, ce serait bien aussi.
Mike Van Dunk

Réponses:


4

Je veux que chaque fichier ait sa propre archive zip, et que l'archive zip partage le nom du fichier, moins l'extension bien sûr.

Script de lot

(Définissez les chemins de dossier explicites complets de la source et de la destination, puis exécutez-les selon vos besoins. La source est l'endroit où les fichiers existent que vous souhaitez compresser et la destination est l'endroit où vous souhaitez les compresser.)

@ECHO ON

SET SourceDir=C:\folder\source
SET DestDir=C:\folder\destination

CD /D "C:\Program Files\7-Zip"
FOR /F "TOKENS=*" %%F IN ('DIR /B /A-D "%SourceDir%"') DO (
    7z.exe a "%DestDir%\%%~NF.zip" "%SourceDir%\%%~NXF"
)
EXIT

Ligne de commande

FOR /F "TOKENS=*" %F IN ('DIR /B /A-D "C:\Folder\Source"') DO 7z.exe a "C:\Folder\Dest\%~NF.zip" "C:\Folder\Source\%~NXF"

Autres ressources


4

Votre script d'origine effectue les opérations suivantes, ligne par ligne:

@echo on

Indique à l'invite de commandes d'imprimer chaque commande dans le fichier de commandes avant de les exécuter. C'est juste pour que vous puissiez "voir" ce qu'il fait vraiment avant de le faire.

cd "C:\Users\MVD21\Desktop\test"

C hangements D irectory dans ce que je souhaite est le chemin où vous voulez zip tous les fichiers.

FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"

Le paramètre INici est (C:\Users\MVD21\Desktop\test). Cela provoquera l' DOexécution de la boucle "body" (l'action derrière le mot-clé ) exactement une fois , avec le %iparamètre affecté à la valeur C:\Users\MVD21\Desktop\test. Il n'est pas surprenant que cela ne fasse pas ce que vous voulez! Il semble que cela compresserait le répertoire entier dans un seul fichier .7z.

S'il ne fait rien , c'est probablement parce qu'il ne trouve pas le chemin de 7z.exe. Si ce fichier n'est pas dans le répertoire courant (ce testrépertoire mentionné ci-dessus), alors il devra être sur le PATH(dans la %PATH%variable d'environnement; essayez echo %PATH%dans un shell pour voir ce qu'il est actuellement défini). Sinon, vous devez copier 7z.exedans le répertoire actuel ou spécifier un chemin absolu vers son emplacement (comme, par exemple, "C:\Program Files\7-zip\7z.exe" ...).

pause

Lorsque le script est terminé, ce mot clé indique simplement au shell d'attendre que vous appuyiez sur Entrée ou fermiez l'invite de commande au lieu de le quitter immédiatement.


Lorsque vous créez un script par lots (ou, en fait, tout autre élément traitant du code), vous devez cesser de traiter l'intégralité du script comme un copier-coller monolithique que vous ne (tentez) pas de comprendre, et décomposez plutôt votre problème en sous-parties que vous pouvez comprendre individuellement, puis raccordez-les ensemble. Cela vous permettra de résoudre les problèmes indépendamment et de créer des solutions au lieu de demander à quelqu'un d'autre de faire tout votre travail pour vous. Je le recommande fortement.

Dans votre cas, vous avez les sous-composants suivants de votre problème:

  1. Parcourez (bouclez) chaque fichier contenu dans un répertoire donné.
  2. Pour chaque fichier donné, placez-le dans un fichier .7z en appelant l' 7zutilitaire.

Les chances que quelqu'un ait déjà une réponse qui résout votre besoin spécifique sont inférieures à celles de pouvoir trouver les pièces les plus générales individuellement.

Cette question, «Comment faire quelque chose pour chaque fichier d'un répertoire dans un script batch» résout la moitié de votre problème.

L'idée maîtresse de la réponse est que vous venez de commencer avec cette partie de cette réponse StackOverflow:

for /f "usebackq delims=|" %%f in ('dir /b "c:\program files"') do echo %%f

et changez la partie où il fait quelque chose (le echo %%f) pour faire ce que vous voulez faire . Je sais que vous devez changer cette partie, car j'ai analysé le texte du script et compris ce que signifie chaque caractère et paramètre, donc je peux raisonner sur l'endroit où je veux insérer mon propre code.

Voici un "code aérien" (non testé!):

for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~ni.7z" "%i"

Les instructions @echo onet pauseci-dessus sont une bonne pratique, vous pouvez donc les laisser. Et vous voudrez probablement conserver cette cdinstruction également, si vos fichiers se trouvent dans ce chemin.

Alors qu'est-ce que cela nous laisse?

@echo on
cd "C:\Users\MVD21\Desktop\test"
for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~nf.7z" "%f"
pause

Si vous répondez par "Ça ne marche pas!", JE NE VOUS AIDERAI PAS. Si vous essayez ceci et que cela ne fonctionne pas, vous DEVEZ me dire dans les commentaires les informations suivantes:

  • Quel message d'erreur exact obtenez-vous dans l'invite de commandes lorsque vous exécutez ces commandes ou les placez dans un fichier de commandes et les exécutez? Ne pas abréger; copiez et collez la sortie directement (mettez-la sur http://pastebin.com si c'est beaucoup).
  • Que pensez- vous que le message d'erreur vous indique que le problème est?
  • Où se trouve votre installation 7-zip (le chemin du fichier)?
  • L'emplacement du fichier de votre installation 7-zip est-il inclus dans le contenu de la PATHvariable d'environnement? (vérifiez cela, comme mentionné ci-dessus, avec echo %PATH%une cmdinvite.)

Je ne pense pas que cela fonctionne parce que j'ai 7zip installé sur un autre lecteur? Cela semble fonctionner si je fais le cd "Location of 7zip" comme dans la réponse originale. Bien sûr, cela ne fonctionne que "parfois". Cela fonctionnait jusqu'à ce que je mette une autre déclaration d'écho en dessous et maintenant ce n'est pas le cas. Et oui, j'essaie de mieux comprendre les fichiers de commandes. J'ai essayé de trouver un glossaire des commandes par lots ou ce qu'il ne fallait pas étudier, donc je le comprends vraiment. Croyez-moi, je préfère comprendre ET le faire fonctionner que le faire fonctionner.
Mike Van Dunk

J'ai essayé votre solution et je ne peux pas vous dire quelle est la sortie car le fichier batch ne s'exécute pas du tout. Il s'ouvre brièvement avec la fenêtre cmd qui clignote, puis se referme. Oui, j'ai une pause là-dedans. J'ai 7zip installé sur mon disque local et sur un disque interne secondaire, mais il ne semble pas faire partie de l'environnement de chemin
Mike Van Dunk

J'aimerais vraiment comprendre, mais la recherche sur Google n'aide pas beaucoup. Par exemple, je n'ai aucune idée de ce qu'est la commande ou le paramètre "'dir / b" ou ce qu'il fait. Je sais que dir est évidemment un répertoire mais je ne sais pas ce que / b. Ce que j'aimerais, c'est que quelqu'un explique ce que font les paramètres pour que je puisse mieux comprendre. Ou si quelqu'un a un lien vers un site où il passe en revue ce genre de chose, ce serait également utile. J'ai recherché «dir / b» dans un fichier de commandes et je n'ai rien trouvé. Je pense que le / b a quelque chose à voir avec les noms de fichiers mais je ne suis pas sûr.
Mike Van Dunk
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.