batchscript – voer opdracht uit op elk bestand in directory

Ik moet een aantal xls-bestanden converteren naar xlsx-bestanden. Ik kan één xls-bestand met succes converteren naar xlsx door deze opdracht uit te voeren in cmd-prompt (windows):

ssconvert inputFileName.xls outputFileName.xlsx

(ssconvert is een opdrachtregelprogramma van Gnumeric dat kan converteren tussen verschillende bestandsindelingen voor spreadsheets)

Ik wil graag een batchbestand schrijven dat VOOR ELK bestand in een opgegeven map de opdracht uitvoert die ik hierboven heb geschreven, waarbij de huidige bestandsnaam zowel voor invoer als voor uitvoerbestandsnaam wordt gebruikt.

Als ik bijvoorbeeld deze set bestanden heb:

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

de uitvoer moet zijn

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

dus de batch-pseudocode zou zoiets moeten zijn als

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

Kan iemand me helpen?


Antwoord 1, autoriteit 100%

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

een paar mensen hebben me gevraagd om dit uit te leggen, dus:

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

Dit deel retourneert een array van bestanden in de huidige map met de extensie xls. De %%ziet er misschien een beetje nieuwsgierig uit. Dit is in feite het speciale teken %van de opdrachtregel zoals gebruikt in %PATH% of %TEMP%. Om het in een batchbestand te gebruiken, moeten we het als volgt escapen: %%PATH%%of %%TEMP%%. In dit geval ontsnappen we gewoon aan de tijdelijke variabele v, die onze reeks bestandsnamen zal bevatten.

We gebruiken de schakeloptie /rom recursief naar bestanden te zoeken, zodat alle overeenkomende bestanden in onderliggende mappen ook worden gevonden.

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

Dit tweede deel wordt één keer uitgevoerd per overeenkomende bestandsnaam, dus als de volgende bestanden aanwezig waren in de huidige map:

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

de volgende opdrachten worden uitgevoerd:

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"


Antwoord 2, autoriteit 51%

Eigenlijk is dit vrij eenvoudig sinds Windows Vista. Microsoft heeft de opdracht FORFILES

toegevoegd

in jouw geval

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

het enige vreemde aan dit commando is dat forfiles automatisch dubbele aanhalingstekens toevoegt rond @file en @fname. maar het zou toch moeten werken


Antwoord 3, autoriteit 24%

je kunt zoiets als dit uitvoeren (plak de onderstaande code in een .bat, of als je wilt dat het interactief werkt, vervang dan de %%door %:

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

Als je powershell kunt gebruiken, is het:

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

Antwoord 4

Ik doe iets soortgelijks om alle c-bestanden in een map te compileren.
probeer dit voor het herhalen van bestanden in een andere map.

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

Other episodes