2010-10-01 5 views
0

J'écris un fichier batch sur Windows qui obtient un argument: un nom de fichier zip qui a été créé avec 7-zip.Besoin d'aide pour l'écriture d'un fichier batch

Ce fichier contient un seul fichier de sauvegarde MySQL à l'intérieur, disons backup.sql.

Je voudrais restaurer la base de données compte tenu de ce fichier zip.

Alors, d'abord je l'extraire dans un répertoire temporaire comme celui-ci:

path_to_7zip\7z e "%~1" -otemp_dir 

Et est maintenant ma question: Comment pourrais-je connaître le nom du fichier extrait (à savoir backup.sql)?

Je voudrais écrire quelque chose comme ceci:

path_to_mysql\mysql < extracted_file_name 

(où extracted_file_name devrait être backup.sql)

Que dois-je écrire au lieu de extracted_file_name si je ne connais pas le nom de fichier qui est à l'intérieur le fichier zip?

Répondre

1

Vous pouvez extraire le fichier dans un répertoire vide, où vous pouvez être sûr que c'est le seul fichier présent. Vous pouvez ensuite utiliser l'instruction pour rassembler un tel nom dans une variable et l'utiliser comme vous le souhaitez.

FOR /F "tokens=*" %%F IN ('dir /b *.sql') DO path_to_mysql\mysql < %%F 

Notez que s'il y a plus d'un fichier SQL dans l'archive, tous seront traités. Je pense que cela pourrait être un bonus, mais ce n'est pas souhaitable, je pense que vous pourriez simplement sauter de la FOR avec un GOTO.


Modifier: en utilisant uniquement la /F forme de FOR j'ai oublié que le "normal" FOR fait déjà le travail dont nous avons besoin.

FOR %%F IN (*.sql) DO path_to_mysql\mysql < %%F 

Notez que tout ce genre de choses ne fonctionne que si le répertoire courant est le répertoire d'extraction, sinon vous devez changer les expressions entre parenthèses en conséquence. Liens bonus: référence pour FOR et FOR /F - les seules commandes qui font quelque chose d'utile en batch - et qui ont évidemment une syntaxe impossible. : D

+0

Comment dois-je rassembler le nom dans une variable? –

+0

Si le répertoire temporaire était initialement vide, utilisez la commande 'for' pour exécuter la commande mysql sur chaque fichier de ce répertoire. Je ne connais pas la syntaxe exacte, mais c'est quelque chose comme 'for/f% s in (% tempdir/*) fait mysql <% s'. –

+0

Ajout d'exemples, voir la réponse originale. –

0

Je pense que 7z a une commande "l" pour lister le contenu d'une archive. redirige cette sortie vers mysql.

+0

L'option 'l' est sympa mais elle imprime beaucoup d'informations en plus du nom de fichier lui-même. Êtes-vous sûr de pouvoir rediriger toute cette sortie vers mysql? –

+0

Non, bien sûr, vous devez l'analyser ou trouver les options appropriées. La ligne de commande 7z n'est-elle pas documentée? – Benoit

+0

Si vous avez besoin d'analyser, nous sommes de retour à la case départ, car nous devons utiliser FOR/F de toute façon. –

Questions connexes