Une itération à travers des dossiers et des fichiers dans le fichier batch?
Voici ma situation. Un projet qui a pour objectif de faire de la migration de certaines pièces jointes à un autre système.
Ces pièces jointes sera situé à un dossier parent, disons-le, " Folder 0
" (voir cette question du diagramme pour une meilleure compréhension), et ils seront zippée/comprimé.
Je veux que mon script batch pour être appelé de la sorte:
BatchScript.bat "c:\temp\usd\Folder 0"
Je suis en utilisant 7za.exe
que la ligne de commande de l'outil d'extraction.
Ce que je veux que mon script batch pour faire consiste à parcourir le "Folder 0
"'s sous-dossiers, et d'en extraire toutes les ZIP contenant les fichiers dans leur dossier respectif.
Il est obligatoire que les fichiers extraits sont dans le même dossier que les fichiers ZIP. Ainsi, les fichiers contenus dans "File 1.zip
" sont nécessaires "Folder 1
" et ainsi de suite.
J'ai lu sur la FOR...DO
commande sur Windows XP Professionnel de la Documentation du Produit - à l'Aide des Fichiers Batch
.
Voici mon script:
@ECHO OFF
FOR /D %folder IN (%%rootFolderCmdLnParam) DO
FOR %zippedFile IN (*.zip) DO 7za.exe e %zippedFile
Je pense que j'aurais aussi besoin de changer le répertoire réel, avant d'appeler 7za.exe e %zippedFile pour l'extraction de fichiers, mais je ne peux pas comprendre comment dans ce fichier de commandes (par le biais, je sais comment faire en ligne de commande, et même si je sais que c'est la même instruction "cd").
EDIT #1
J'ai déjà reçu quelques conseils sur la ServerFault
à la même question. Consultez les réponses à ce lien.
Cependant, il extrait de la racine (C:), et non à partir de la donnée en paramètre dossier.
Quelqu'un a une idée?
EDIT #2
Il semble que le script de commandes ne gère pas les dossiers et les noms de fichier contenant un caractère d'espace de manière adéquate. Quelqu'un peut confirmer ce que je pense?
EDIT #3
J'en ai besoin pour être pleinement récursive, car je ne connais pas la structure de répertoire à l'encontre de laquelle il sera utilisé.
EDIT #4.un
Avec @aphoria la solution, j'y suis presque! Le seul problème est qu'il faut disons
File5.zip
, récupérer le nom de fichier uniquement pour obtenirFile5
, crée un sous-dossierFile5
et de l'extrait de laFile5.zip
àFile5
sous-dossier, puis, il veut créer unFile5
sous-dossier dansFolder 1
, où il doit, au contraire, veulent créerFile1
sous-dossier, à suivre mon exemple.
EDIT #4.b
Comme demandé, voici le code tel qu'il est actuellement look:
@echo off
setlocal enableextensions enabledelayedexpansion
rem
rem Display instructions when no parameter is given.
rem
if "%1" equ "" (
echo Syntaxe : od.bat ^<directory mask>^
echo Exemple : od.bat *
goto :Eof
)
rem
rem Setting the PATH environment variable for this batch file for accessing 7za.exe.
rem
path=c:\temp;%PATH%
rem
rem Removing quotes from the given command line parameter path.
rem
set root=%1
set root=%root:~%1
set root=%root:~0,-1%
rem Searching directory structure from root for subfolders and zipfiles, then extracting the zipfiles into a subfolder of the same name as the zipfile.
for /F "delims==" %%d in ('dir /ogne /ad /b /s %root%') do (
echo Traitement du dossier : "%%d"
for /F "delims==" %%f in ('dir /b "%%d\*.zip"') do (
rem Getting filename without extension.
set subfolder=~n%f
mkdir "%%d\%subfolder%"
rem Extracting zipfile content to the newly created folder.
7za.exe e "%%d\%%f" -o"%%d\%subfolder%"
)
)
:Eof
endlocal
Idées de quelqu'un?
Ma conjecture est qu'il creuse une hiérarchie de répertoire à la fois. Voici l'affaire. Considérons que nous avons un Folder A
dans Folder 1
(Dossier 1\A), ensuite, il recherche de Folder 1
par Folder 5
, et revient Folder 1\Folder A
, où l' %sous-dossier% variable bâtons avec sa dernière valeur.
L'aide de personne est grandement appréciée.
OriginalL'auteur Will Marcouiller | 2010-06-08
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas très familier avec le 7zip options de ligne de commande, de sorte que vous aurez besoin de comprendre à la commande exacte pour cela, mais le script ci-dessous permettra de prendre pleinement chemin d'accès spécifié (espaces autorisés) et d'imprimer le nom du dossier et .zip fichiers contenus dans le.
L'exécuter comme ceci:
MyScript.CMD "c:\temp\usd\Folder 0"
Vous devriez obtenir un résultat semblable à ceci:
Mise à JOUR
Le code ci-dessous l'extrait de
Folder A\File 1.zip
à un nouveau dossierFolder A\File 1
.Quelques choses à garder à l'esprit:
FOR
boucle, vous devez avoir%ROOT%
entre guillemets pour traiter des dossiers avec des espaces dans le nom.SET
ting une variable à l'intérieur de la deuxièmeFOR
, vous avez besoin de mettreSETLOCAL ENABLEDELAYEDEXPANSION
au début. Ensuite, faire référence à la variable à l'aide ! (par exemple,!subfolder!
) à l'expansion de la force au moment de l'exécution.set subfolder=~n%f
doit être ceset subfolder=%%~nf
ECHO
en face de laMKDIR
et7za.exe
commandes pour tester. Une fois que vous êtes sûr qu'il est en train de faire ce que vous voulez, supprimer laECHO
déclaration.Voici le code:
Ajouter un
/S
à laDIR "%ROOT%" /AD /B
de commande.Nous y sommes presque! Merci à vous et à la solution fournie! =) La seule chose que j'ai maintenant à traiter est: est-ce > Il est toujours souhaitez créer le même sous-dossier partout où il a extraire une zipfile. Voir mon edit. =)
Je ne suis pas sûr que je suis bien comprendre. Mise à jour de la question avec votre code comme il n'y paraît actuellement?
Veuillez voir mon code dans EDIT #4.b. Merci pour votre aide! =)
OriginalL'auteur aphoria