web-dev-qa-db-fra.com

script batch - commande d'exécution sur chaque fichier du répertoire

J'ai besoin de convertir des fichiers xls en fichiers xlsx. Je peux convertir avec succès un fichier xls en xlsx en exécutant cette commande dans l'invite cmd (windows):

ssconvert inputFileName.xls outputFileName.xlsx

(ssconvert est un utilitaire de ligne de commande de Gnumeric pouvant convertir des formats de fichier de feuille de calcul différents)

Je voudrais écrire un fichier de commandes qui FOR EACH dans un répertoire spécifié exécute la commande que j'ai écrite ci-dessus, en utilisant le nom du fichier actuel à la fois pour l'entrée et pour le nom du fichier de sortie.

Par exemple, si j'ai cet ensemble de fichiers:

c:\directory\file1.xls
c:\directory\file2.xls
c:\directory\file3.xls

la sortie devrait être

c:\directory\file1.xlsx
c:\directory\file2.xlsx
c:\directory\file3.xlsx

donc le pseudo-code de lot devrait être quelque chose comme

directory = c:\directory\
for (fileName in directory)
    ssconvert fileName.xls fileName.xlsx

Quelqu'un peut-il m'aider?

28
BeNdErR
for /r %%v in (*.xls) do ssconvert "%%v" "%%vx"

un couple a des gens m'ont demandé d'expliquer cela, alors:

Partie 1: for /r %%v in (*.xls)

Cette partie renvoie un tableau de fichiers dans le répertoire en cours ayant l'extension xls. Le %% peut paraître un peu curieux. Il s’agit essentiellement du caractère % spécial de la ligne de commande, tel qu’il est utilisé dans% PATH% ou% TEMP%. Pour l'utiliser dans un fichier batch, nous devons l'échapper comme suit: %%PATH%% ou %%TEMP%%. Dans ce cas, nous échappons simplement à la variable temporaire v, qui contiendra notre tableau de noms de fichiers.

Nous utilisons le commutateur /r pour rechercher des fichiers de manière récursive. Ainsi, tous les fichiers correspondants des dossiers enfants seront également localisés.

Partie 2: do ssconvert "%%v" "%%vx"

Cette seconde partie est ce qui sera exécuté une fois par nom de fichier correspondant, donc si les fichiers suivants étaient présents dans le dossier actuel:

c:\temp\mySheet.xls, c:\temp\mySheet_yesterday.xls, c:\temp\mySheet_20160902.xls 

les commandes suivantes seraient exécutées:

ssconvert "c:\temp\mySheet.xls" "c:\temp\mySheet.xlsx" ssconvert "c:\temp\mySheet_yesterday.xls" "c:\temp\mySheet_yesterday.xlsx" ssconvert "c:\temp\mySheet_20160902.xls" "c:\temp\mySheet_20160902.xlsx"

38
paul

En fait, c'est assez facile depuis Windows Vista. Microsoft a ajouté la commande FORFILES

dans ton cas

forfiles /p c:\directory /m *.xls /c "cmd /c ssconvert @file @fname.xlsx"

la seule chose étrange avec cette commande est que forfiles ajoute automatiquement des guillemets autour de @file et @fname. mais ça devrait marcher quand même

21
weberik

vous pouvez exécuter quelque chose comme ceci (collez le code ci-dessous dans un fichier .bat, ou si vous voulez qu'il s'exécute de manière interractive, remplacez le %% par %:

for %%i in (c:\directory\*.xls) do ssconvert %%i %%i.xlsx

Si vous pouvez exécuter PowerShell ce sera:

Get-ChildItem -Path c:\directory -filter *.xls | foreach {ssconvert $($_.FullName) $($_.baseName).xlsx }
9
Loïc MICHEL

Je fais la même chose pour compiler tous les fichiers c dans un répertoire. 
pour itérer des fichiers dans un répertoire différent, essayez ceci. 

set codedirectory=C:\Users\code
for /r  %codedirectory% %%i in (*.c) do 
( some GCC commands )
0
Rishikesh Ayre