Avatar billede hansjacob Nybegynder
27. september 2003 - 08:50 Der er 14 kommentarer

Batch: løbe direktorier igennem

Hej

jeg vil gerne lave et lille batchs script der kan løbe alle filer igennem og køre et lille program på en bestemt type filer.

Problemet er jeg skal have konverteret en pokkers masse .eps filer til .pdf filer vha et program der hedder "epstopdf". Men jeg har rigtig mange filer! Hvis det kan gøres rekursivt ville det også være dejligt.

I pseudo koder ville det se nogenlunde sådan ud:

while(list all dirs and sub-dirs){
currentFile = file
if(type(currentFile)==eps)then
  epstopdf currentFile
end if
end while

Håber I kan hjælpe med syntaxen.
Avatar billede soreno Praktikant
27. september 2003 - 09:04 #1
Total commander har et plugin der skulle kunne gøre det:
http://ghisler.fileburst.com/plugins/makebat.zip

Total commander kan hentes her:
http://www.ghisler.com/
Avatar billede grinderslev Praktikant
27. september 2003 - 09:08 #2
Du kan ikke umiddelbart få en batch fil til at kikke i dine sub-dir, med mindre du direkte angiver navnet på dem...
Avatar billede soreno Praktikant
27. september 2003 - 09:13 #3
Et alternativ var at lave et lille util der genererer en bat fil (f.eks. i c/c++).
Altså, som løber rekursivt gennem strukturen og outputter en bat fil.
Avatar billede hansjacob Nybegynder
27. september 2003 - 09:27 #4
Det er ikke det store problem at skrive alle direktorierne, så mange er der heller ikke. Så hvis der bare kan skrive et lille et, hvor jeg måske giver direktoriet som argument, så ville det være fint!
Avatar billede soreno Praktikant
27. september 2003 - 09:30 #5
Jeg er dog overbevist om at "makebat" er lavet netop til det formål - jeg har dog aldrig prøvet det selv.

Jeg kan godt lave programmet til dig, men jeg tror ikke det bliver idag jeg får tid.
Avatar billede bertelbrander Novice
27. september 2003 - 12:39 #6
Følgende kommando løber igennem alle filer i det direktorie den er kørt fra og udskriver navnet på filen:

for /R %I in (*) do @echo %I

Man kan få den til at køre igennem alle filer med en bestemt extension:

for /R %I in (*.eps) do @echo %I

Hvis epstopdf skal køres for alle .eps filer i nuværende direktorie og underdirektorie skriver man:

FOR /R %I in (*.eps) do @epstopdf %I

Du kan putte det i en bat-fil, så skal du skrive:

FOR /R %%I in (*.eps) do @epstopdt %%I
Avatar billede hansjacob Nybegynder
27. september 2003 - 12:53 #7
-> bertelbrander

Det virker jo fremragende! Undskyld min dumhed, men hvordan hvis jeg nu vil fyre både echo og epstopdf af i samme?
Avatar billede bertelbrander Novice
27. september 2003 - 13:02 #8
FOR /R %I in (*.eps) do @echo %I & epstopdf %I

Husk at der skal stå %%I hvis det er i en bat-fil.
Avatar billede hansjacob Nybegynder
27. september 2003 - 13:04 #9
Så skal jeg jo bare lige have et svar, så du kan få dine point!
Avatar billede bertelbrander Novice
27. september 2003 - 13:06 #10
Jeg forsøger at undgå at få point.
Avatar billede hansjacob Nybegynder
27. september 2003 - 13:09 #11
Nå, ok, så skal du da også bare være fri ;-). Men tak for hjælpen i hvert fald!
Avatar billede hansjacob Nybegynder
28. september 2003 - 14:30 #12
Hmm, ja nu bliver jeg jo krævende, for nu vil jeg gerne udvide!

Nu skal den kunne køre et program, hvis det er en .eps fil og et andet, hvis det er en jpg! + den skal lave efternavnet om.... Er det noget en eller anden (bertelbrander??) kan hjælpe med?

dvs noget i stil med følgende:
if(*.jpg || *.jpeg) do
  @jpeg2ps %I > %I &".eps"
elseif(*.eps) do
@epstopdf %I
Avatar billede bertelbrander Novice
28. september 2003 - 16:18 #13
Du kan putte følgende i en bat-fil.
Det vil køre igennem alle filer og checke deres extension, hvilket sker i "funktionen" :do_it
I :do_it er %1 extension (inklusive .) %2 er hele fil-navnet og %3 er filnavnet uden extension.
Du skal rette scriptet så det udfører de kommandoer du vil have udført for de enkelte extensions. Du kan slette den sidste linie hvis du ikke ønsker at se output for alle ukendte extensions.
Hvis du vil have kørt epstopdf for alle .eps filer og have udskrevet filnavnet kan du skrive:
if /I {%1}=={.eps} echo eps-file %2 & epstopdf & goto :eof
Jeg er ikke sikker på hvordan det er du vil have kommando linien for .jpg filer til at se ud, men hvis du vil have følgende kommando udført for test.jpg:
jpeg2ps test.jpg > test.eps
Skiver du:
if /I {%1}=={.jpg} echo jpg-file: %2 %3 & jpeg2ps %2 >%3.eps goto :eof

@echo off
for /R %%I in (*) do call :do_it %%~xI %%I %%~dpnI
goto :eof

:do_it
if /I {%1}=={.eps} echo eps-file %2 %3 & goto :eof
if /I {%1}=={.jpg} echo jpg-file: %2 %3 & goto :eof
if /I {%1}=={.jpeg} echo jpeg-file: %2 %3 & goto :eof
echo Other-file: %2
Avatar billede hansjacob Nybegynder
29. september 2003 - 22:13 #14
Det virker jo vildt fedt! Tak for det! Du har virkelig sparet mig for mange timers arbejde og mange fejl!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester