Faq/General/150/nl

Context
In Windows 10 kunnen we met een commando als soffice.exe --convert-to odt my_document.docx gebruiken om een bestand van het docx-formaat van Microsoft om te zetten naar het Open Document formaat (odt). Met --convert-to mogen we een aantal documenten specificeren door een wildcard te gebruiken. Voorbeeld: met *.docx kunnen we dan aangeven dat we alle docx-bestanden in de huidige map bedoelen.

Probleem
Maar als we dit in de Windows Command shell doen, dan werkt dit niet. Alle conversies lijken tegelijk te starten, omdat er maar een instantie van LibreOffice (soffice.exe) echt actief kan worden bij het opstarten vanaf de commandoregel, blijft het proces hangen. Er zal best een of twee bestanden geconverteerd worden maar je zult wel meerdere processen handmatig moeten stoppen (kill).

Oplossing
We gebruiken hiervoor het Windows Subsysteem voor de Linux (WSL) omgeving, die door Windows vanaf Windows10 wordt aangeboden. Mogelijk moet het wel eerst worden geïnstalleerd. Dat is hier beschreven.

Daarna heb je toegang tot een Bash shell bovenop je Windows-systeem, en zal --convert-to goed werken, en synchroon.

Beknopte beschrijving

 * 1) Bepaal het pad naar soffice.exe.
 * 2) Ga in de shell met   naar de map met te converteren bestanden, nadat je een map hebt bepaald waar de geconverteerde bestanden moeten komen te staan.
 * 3) Voer dit commando uit:  --convert-to odt --outdir  *.docx

Voorbeeld
"/mnt/c/Program Files/LibreOffice 5/program/soffice.exe" --convert-to odt --outdir ./Converted_To_odt *.docx zal de docx-bestanden in de huidig map converteren naar de map /Converted_To_odt

Waarom deze syntaxis?
WSL mount een compleet bestandsysteem van zichzelf. Hierdoor is de syntaxis om een bestandslocatie aan te geven anders dan onder Windows. Het eerste verschil is het rootpunt: In Windows is het C:\, de tegenhanger van de bash shell is /mnt/c/. Het token scheidingsteken is in Windows \, in de bash is het die van Unix /. Verder zijn de regels gelijk. Zet bij bestandsnamen met een of meer spaties, dubbele-quotes (") om de bestandsnaam.

Hoe het commando te schrijven?
Bekijk de snelkoppeling die je gebruikt om LibreOffice te starten. Rechts-klik op het bestand en dan op "Eigenschappen", kopieer de inhoud van "Doel". In het voorbeeld is dat dan: "C:\Program Files\LibreOffice\program\soffice.exe". Pas dit aan naar wat het dan voor de bash shell wordt, dus : "/mnt/C:/Program Files/LibreOffice/program/soffice.exe" NB: Unix is hoofdlettergevoelig, Windows niet.

Klaar.

Conclusie
De Bash shell is in Windows een eenvoudige manier op meerdere bestanden te converteren van het bestandsformaat met gebruik van de ingebouwde LibreOffice commandoregel.

Het kan ook interactief
Nog eenvoudiger is het gebruiken van het ingebouwde LibreOffice Document conversieprogramma.

Starten: 

Volgens een gebruiker is er wel een grens aan het aantal tegelijk te converteren documenten, als het programma crashed probeer dan een lager aantal in een keer te converteren.

Een langere beschrijving
Het probleem is niet dat alle conversies tegelijk worden gestart maar dat LibreOffice's  eigenlijk geen wildcards ondersteund. Het werkt wel op niet-Windows omdat die de wildcards verwerken in hun shell. (Op Windows werkt het in een shell ook wel, bijvoorbeeld met Cygwin of WSL).

Dat betekent dat in Bash, bij het uitvoeren van het commando, het commando eerst geanalyseerd wordt door Bash, dat het deel   vertaalt naar een opsomming van de bestanden die aan dat masker voldoen. De opsomming is dan een tekenreeks die het deel  vervangt met iets als. Dat is wat LibreOffice ziet.

Het Windows-commando cmd.exe doet dat omzetten niet, waarna LibreOffice denkt dat het een bestand  moet openen, dat zal niet lukken.

In cmd.exe zou het voorverwerken expliciet gedaan kunnen worden, iets als volgt:

for %f in ("path\to\*.doc") do "C:\Program Files\LibreOffice\program\soffice" --convert-to odt "%f"

Dit verzoek tot uitbreiding (hier wildcards kunnen gebruiken) is in behandeling genomen. Mogelijk werkt het in de versies na mei 2021 uitgebracht, mogelijk zonder het gedeelte submappen.