Avatar billede nph12 Nybegynder
15. september 2003 - 14:39 Der er 114 kommentarer og
1 løsning

Kopiere filer ved hjælp af en batch-fil del 2

Hej
Dette er fortsættelsen af spørgsmål: http://www.eksperten.dk/spm/394907

Det sidste indlæg:

Der er flere måder man kan gøre det hurtigere, men scriptet bliver let meget kompliceret.
Man kunne lave en fil med alle filer og deres størrelse vha:
for %%I in (*) do echo %%~zI %%I >>list.txt
Derefter kunne man sortere filerne i list.txt filen efter størrelse vha kommandoen sort.
Så kunne læse text-filen og sammenligne de filer der har samme størrelse.

Det er også muligt at man kan lave scriptet hurtigere ved at udføre de to første if i funktionen :compare inden man kalder funktionen, derved ville man undgå en række funktionskald. For løkken vil så komme til at se ca. sådan ud (utestet):
for %%A in (*) do if not [%%A]==[%1] do if not [%%~zA]==[%2] call :compare "%%A" %1

Så kunne man fjerne de to første linier i :compare funktionen
Avatar billede nph12 Nybegynder
15. september 2003 - 14:46 #1
Jeg har prøvet at lave en bat-fil med denne kommando:
for %%I in (*) do echo %%~zI %%I >>list.txt

Listen ser fint ud.

Jeg kan ikke rigtigt få det andet til at virke. Scriptet skriver noget med, at "do" ikke blive genkendt af batch-programmet. Har jeg misforstået noget?

for %%A in (*) do call :First "%%A" %%~zA
goto :eof

:First
for %%A in (*) do call :compare "%%A" %1 %%~zA %2
goto:eof

:compare
for %%A in (*) do if not [%%A]==[%1] do if not [%%~zA]==[%2] call :compare "%%A" %1
fc /B %1 %2 |findstr "Ingen forskelle fundet"
fc /B %1 %2
if errorlevel 1 goto :eof
echo %1 and %2 is the same file
del %1
Avatar billede bertelbrander Novice
15. september 2003 - 20:54 #2
1: Du skal kun have to loops, den første og den efter :first

2: Den loop der er efter :first skal ligne den der er efter :compare, bortset fra at do er en del af for kommandoen, så du skal kun have en do, den første.

Er der andre end mig og nph12 der læser dette?

Det var måske en ide at stille spørgsmålene i en af programerings kategorierne, f.ex: http://www.eksperten.dk/kat/295
Avatar billede nph12 Nybegynder
15. september 2003 - 21:52 #3
Det kan godt være, at jeg skal flytte spørgsmålet.

Har jeg rette de rigtige steder? Jeg har prøvet at køre dette script, men forstår det ikke. Jeg synes, at det stadigvæk sammenligner alle filer med hinanden.

Scriptet skal sortere alle filerne efter størrelse, og hvis der så er nogle der er ens, skal scriptet sammenligne disse og slette dem der for mange af.


for %%A in (*) do call :First "%%A" %%~zA
goto :eof

:First
for %%A in (*) do if not [%%A]==[%1] if not [%%~zA]==[%2] call :compare "%%A" %1
goto:eof

:compare
fc /B %1 %2 |findstr "Ingen forskelle fundet"
fc /B %1 %2
if errorlevel 1 goto :eof
echo %1 and %2 is the same file
del %1
Avatar billede bertelbrander Novice
15. september 2003 - 23:03 #4
Der er tre fejl:

1: I den første for loop kalder vi :first med filnavnet i "" for at ungå problemer med filernavne der har mellemrum. Så den første if sammenligner et filnavn med "" omkring mod et uden. Så vi kan tilføje "" til det andet filnavn med if not ["%%A"]==[%1] eller fjerne det for det første med if not [%%A]==[%~1]

2: Den anden if vender forkert, vi skal netop sammenligne de to filer hvis de har samme størrelse, dvs fjene not efter den anden if.

3: I :compare er der to fc kommandoer, jeg går ud fra at nummer to er der for at kunne teste hvad der sker. Men den bør være først, fordi vi med "if errorlevel 1 goto :eof" ønsker at checke errorlevel fra findstr kommandoen.

Da jeg nu har fortalt hvordan man får scriptet til at virke, kunne opgaven gå ud på at forklare hvad der sker...
Avatar billede nph12 Nybegynder
15. september 2003 - 23:53 #5
Regner med det er sådan her, scriptet skal se ud. Det ser ud som om scriptet sammenligner en fil med alle de andre filer og kalder compare, hvis størrelsen på de to filer er lige store.

Det tager stadigvæk alt for lang tid. Hvis alle filer skal sammenlignes om alle filer, så tager det flere dage (f.eks. 2000 billeder * 2000 billeder= 4000000 billeder, som skal køres igennem af scriptet)

Kan man ikke få scriptet til at sortere efter størrelsen ligesom med
for %%I in (*) do echo %%~zI %%I >>list.txt

og så der, hvor der er flere filer med samme størrelse, laver man en sammenligning. Altså køre f.eks. de 2000 billeder igennem og finde f.eks. de 50 billeder som har samme størrelse og sammenligner dem. På den måde er der kun ca. 2000 billeder, som skal køres igennem scriptet og ikke 4000000 billeder.

Kigger lige på det endnu en gang i morgen.

for %%A in (*) do call :First "%%A" %%~zA
goto :eof

:First
for %%A in (*) do if not ["%%A"]==[%1] if [%%~zA]==[%2] call :compare "%%A" %1
goto:eof

:compare
fc /B %1 %2
fc /B %1 %2 |findstr "Ingen forskelle fundet"
if errorlevel 1 goto :eof
echo %1 and %2 is the same file
del %1
Avatar billede bertelbrander Novice
16. september 2003 - 01:02 #6
Man kan godt lave det så man arbejder på en liste med filer der er sorteret efter størrelse, men det bliver let lidt tungt at arbejde med, og jeg tror at du skal øve dig lidt mere på lidt simplere scripts først.
Avatar billede nph12 Nybegynder
16. september 2003 - 15:25 #7
Jeg tror også, at jeg skal have lidt mere øvelse i scripts først, så jeg holder mig til det andet spørgsmål http://www.eksperten.dk/spm/398456 og får lidt øvelse der.

Jeg har stadigvæk alle de billeder, som jeg skal have sorteret i. Det vil være en meget stor hjælp, hvis du kunne lave scriptet så det kører hurtigere, da jeg snart får nogle ekstra billeder af familie og venner.

På forhånd mange tak!
Avatar billede bertelbrander Novice
16. september 2003 - 20:55 #8
Jeg havde selv problemet for noget tid siden og besluttede da at det letteste og hurtigste var at lave et lille c-program til at fjerne dupletter, jeg har lagt det her:

http://home20.inet.tele.dk/midgaard/checkdup.zip

Når du skal bruge det starter du med at lave en list-fil der indeholder alle de filer der skal checkes, dette kan gøres med dir kommandoen, f.ex:

dir /B *.jpg >dir.lst
dir /B *.gif >>dir.lst

eller hvis du blot vil have alle filer i nuværende direktorie og underdirektorier:

dir /S /B *.* >dir.lst

Det er vigtigt at du bruger /B, da list-filen kun skal indeholde filnavn.

Så kører du checkdup.exe med listfilen som argument:

checkdup.exe dir.lst

Hvis du gerne vil spørges hvergang den finder to filer der er ens tilføjer du -a som argument:

checkdup -a dir.lst

(Hvis du bruge -a og ikke ønsker at den sletter nogen af filerne svarrer du blot med noget andet end 1 eller 2).
Avatar billede nph12 Nybegynder
16. september 2003 - 23:11 #9
Når jeg kører checkdup.exe filen får jeg følgende fejlmeddelse: "Det var ikke muligt af finde DLL'en cygwin1.dll i den angivne sti....." Hvad skal jeg gøre?

Jeg har fået lavet dir.lst filen.
Avatar billede bertelbrander Novice
16. september 2003 - 23:24 #10
Ups, jeg havde ved et uheld kompileret med cygwin. Jeg har uploadet en ny version der er kompileret med BorlandC denne bruger ikke cygwin1.dll
Filnavnet er stadig:
http://home20.inet.tele.dk/midgaard/checkdup.zip
Avatar billede nph12 Nybegynder
17. september 2003 - 00:20 #11
Det virker bedre med denne version af programmet. Jeg har lige kørt programmet og det ser ud til at virke fint. Det går MEGET stærkere!

Hvordan virker programmet?
Avatar billede bertelbrander Novice
17. september 2003 - 00:40 #12
C source koden til programmet findes i checkdup.c der er med i zip-filen ;-)

Der er sådan set ikke noget inviklet i det, der checkes for om filerne har samme størrelse og hvis de har det sammenlignes filerne byte for byte indtil der er fundet en forskel, hvis der ikke findes en forskel er de ens og den ene slettes.

Programmet demonstrerer fint at bat-scripts ikke er hurtige og til lidt mere komplicerede opgaver er andre sprog som f.ex. C at forretrække.
Avatar billede nph12 Nybegynder
17. september 2003 - 16:32 #13
Nu kender jeg ikke så meget til programmering (endnu) og ved ikke, hvad C er og hvordan man programmere i det. Jeg har set koden til programmet og forstår ikke ret meget af det.

Jeg holder mig til bat-scripts og prøver at lave noget grundlæggende.

Jeg er rigtigt glad for programmet, da det løser opgaven på ingen tid og programmet gør jo det, det skal.

Du vil stadigvæk ikke have nogle point? Så vil jeg tage og lukke spørgsmålet.

Mange tak for hjælpen.
Avatar billede bertelbrander Novice
17. september 2003 - 17:08 #14
Jeg vil stadig ikke have point.
Avatar billede nph12 Nybegynder
17. september 2003 - 17:23 #15
Okay, så lukker jeg spørgsmålet.
Avatar billede nph12 Nybegynder
20. oktober 2003 - 15:27 #16
Hjælp, jeg har brug for din hjælp!

Jeg har et lille problem, som du måske kan hjælpe mig med! Mit ene memory card mange billeder fra ferien, ville ikke læses i min memory card læser. Ved hjælp af et recovery program, lykkes det mig at redde alle billederne undtaget tre.

Da recovery programmet har givet dem andre navne, end dem som kameratet har givet dem, er det gået kage i navngivningen af billederne. Kort og godt er der kaos i mine billeder nu.

Jeg har prøvet at køre checkdup, men der er stadigvæk billeder som er ens (ens billeder, men forskellige navne). Hvordan finder jeg alle ens billeder (også selvom de hedder noget andet)?

Kan man gøre en eller andet, så man kan ændre navngivning "tilbage" til det gamle/rigtige? Billederne indeholder data om, hvornår de er taget (tid og dato). F.eks. på navngivning fra kameraet DSC01558.JPG og navngivningen fra recovery programmet File64.JPG.

Håber du kan hjælpe mig :-) På forhånd mange tak!
Avatar billede bertelbrander Novice
20. oktober 2003 - 20:27 #17
checkdup burde finde ens billeder selv om de har forskellige navne.

Du skriver at "Billederne indeholder data om, hvornår de er taget", hvordan læser man disse data, og hvordan oversætter man disse data til filnavn? Er filnavnet blot et fortløbende nummer? Er dato og tid på filerne korrekte?
Avatar billede nph12 Nybegynder
20. oktober 2003 - 21:49 #18
Jeg har prøvet at køre checkdup igen. Jeg har gjort følgende:

1) dir /S /B *.* >dir.lst
2) checkdup -a dir.lst

Dog står der ud for nogle af filerne "Unable to open:...."

Når jeg så indlæser alle billederne i mit billedbehandlingsprogram, kan jeg se at der er flere ens billeder med et forskelligt navn (billedet er det samme, da det er taget på samme tidspunkt).

Filnavnet der bliver skrevet af kameraet er fortløbende (DSCXXXXX.JPG, hvor x er det fortløbende nummer). Billederne indeholder data om, hvornår billedet er taget, dette kan ses i mit billedbehandlingsprogram (jeg ved ikke, hvordan det indhenter disse data).

Heldigvis er dato og tiden korrekt på alle billederne.
Avatar billede bertelbrander Novice
20. oktober 2003 - 23:11 #19
Jeg lavede lige et bat-scrip der omdøber alle jpg-filer i den mappe det er kørt i til DCSxxxxx.jpg, xxxxx er et fortløbende nummber der starter med et tal som du skal angive som parameter. For at teste udskriver det kommandoen i stedet for at udføre den, fjern echo i næst sidste linie hvis det ser ud til at virke.

@echo off
if [%1]==[] echo Du skal angive et startnummer& goto :eof
set Start=%1
for /F %%I in ('dir /B /OD *.jpg') do call :process "%%I"
goto :eof

:Process
set Current=00000%Start%
set Current=%Current:~-5%
echo ren %~1 DSC%Current%.jpg
set /A start=%Start%+1

Du bør kopiere de filer der har forket navn til en ny mapppe og gemme ovenstående script der.

Den ældste fil vil få det laveste nummer og den nyeste vil få det største.
Jeg ved ikke hvordan man udlæser dato informationen fra et billede, jeg kan måske finde ud af det, men prøv lige om ovenstående ikke løser problemet.

Jeg vil kikke lidt på checkdup senere og se om jeg kan finde fejlen.
Avatar billede nph12 Nybegynder
20. oktober 2003 - 23:59 #20
Jeg har lavet en mappe med de "forkerte" navngivet billeder. Jeg har kørt bat-script og det ser også ud til at det omdøber billederne, men når jeg så kigger i mappen er der ikke sket noget. Hvad gør jeg forkert?

Problemet med de "forkerte" billeder er, at de alle er oprettet indenfor nogle få sekunder af recovery programmet (dette kan man se, når man højreklikket på billedet og vælger egenskaber. Dog kan billedbehandlingsprogrammet læse, hvornår billedet er taget (disse oplysninger er korrekte).

Recovery programmet har navngivet filerne sådan: File1.JPG, File10.JPG-File19.JPG også File2.JPG. osv.
Avatar billede bertelbrander Novice
21. oktober 2003 - 00:19 #21
Jeg gentager lige fra 20/10-2003 23:11:18:
"For at teste udskriver det kommandoen i stedet for at udføre den, fjern echo i næst sidste linie hvis det ser ud til at virke."

Hvordan ser du tidspunktet i billedbehandlingsprogrammet? Er det en del af billedet eller er det en seperart billed information?
Avatar billede nph12 Nybegynder
21. oktober 2003 - 16:05 #22
Nu har jeg prøvet med uden echo i næst sidste linie. Bliver rækkefølgende rigtigt, når "Recovery programmet har navngivet filerne sådan: File1.JPG, File10.JPG-File19.JPG også File2.JPG. osv."?

Billedbehandlingsprogrammet viser dato og tidspunkt over billedet. Så kan man også kigge i complete metadata, hvor der næsten står alt om billedet.
Avatar billede bertelbrander Novice
21. oktober 2003 - 20:46 #23
Bat-scriptet bruger ikke filnavnet til noget. Du kan evt. prøve at fjerne /OD fra dir kommandoen og se om det giver et bedre resultat.

Jeg vil gerne se en fil med dato og tidspunkt, kan du sende mig en?
Jeg kan prøve om jeg kan læse dato og tidspunkt og bruge det til at navngive filerne. Jeg kan måske også lave det så filernes data og tid (som du ser den i explorer) bliver sat ud fra det der står i billedet.
Avatar billede bertelbrander Novice
21. oktober 2003 - 20:53 #24
Jeg kan også godt lave et script der bruger numrene fra Filexx.jpg til at omdøbe til DSCxxxxx.jpg. Det kræver dog at numrene fra Filexx.jpg har den rigtige rækkefølge.
Avatar billede nph12 Nybegynder
21. oktober 2003 - 22:57 #25
Jeg har uploadet billedet til denne adresse:
http://www.nph12.frac.dk/File17.JPG

Billedet fylder ca. 1,3 mb. Når billedet åbnes i IE, så gem det som en jpg-fil.
Avatar billede bertelbrander Novice
22. oktober 2003 - 00:37 #26
Jeg tror jeg har fundet en løsning.

1: Start med at kopiere de berørte filer ind i en tom mappe.

2: Download & udpak filedate.exe fra:
http://home20.inet.tele.dk/midgaard/filedate.zip
gem filedate.exe i den mappe som du lavede i punkt 1

3: Åben en kommando prompt & skift til mappen fra punkt 1 (cd ...)

4: Kør følgende kommando:
for %I in (*.jpg) do @echo %I& filedate %I
Nu skulle den gerne skrive alle filer og den dato og tid der er gemt i billedet, f.ex:

File17.JPG
Time: 2003:07:07 11:36:26

Hvis ikke det ser rigtigt ud, så send et billed der fejler og stop her. Som du kan se er det billed du sendte taget d. 7/7 hvilket gør at jeg ikke rigtigt kan se om det første 7-tal er måned eller dag, jeg har gået ud fra at det første 7-tal er måned.

5: Hvis det ser rigtigt ud, kan du sætte filedate.exe til at ændre dato og tid på filerne til den dato & tid der står i billedet, det gør du ved at køre kommandoen:

for %I in (*.jpg) do @echo %I& filedate -d %I

Nu skulle alle billederne gerne have den rigtige dato og tid, check ved at køre en dir.

6: Hvis alt ser fint ud kører du scriptet fra "20/10-2003 23:11:18", og filerne skulle nu have de rigtige navne.
Avatar billede nph12 Nybegynder
22. oktober 2003 - 19:27 #27
Jeg har fået det til at virker:-) Det virker fint!

Nu mangler jeg bare at få det sæt ind i den rigtige rækkefølge. Hvordan finder jeg det højeste filnummer, i de billeder med "rigtig" navnangivning?

Kan jeg navngive ALLE mine billeder på nu?
Avatar billede bertelbrander Novice
22. oktober 2003 - 20:10 #28
At finde det højeste filnummer burde ikke være svært, åben explorer og scroll ned til det sidste billede og aflæs numret (eller har jeg misforstået spørgsmålet?).

Jeg forstår ikke "Kan jeg navngive ALLE mine billeder på nu?" Det burde vel ikke være nødvendigt at omdøbe dem alle. Men hvis du gør bør du give dem et andet navn end DSCxxxxx.jpg
Avatar billede nph12 Nybegynder
22. oktober 2003 - 21:36 #29
Da jeg har en del undermapper med billeder og disser er inddelt i begivenheder, så det er ikke bare lige scrolle ned til det sidste billede. Kan man ikke på en eller anden måde gennemsøge alle undermapper for det højeste filnummer?

Når jeg har det højeste filnummer, kan jeg omdøbe rigtigt de "forkerte" filnavne.

Men da jeg har slettet nogle få billeder (da jeg ikke synes de var gode), er der "hul" jeg rækkefølgen. Det kunne være dejlige at kunne omdøbe filerne, så der ikke er nogle "huller" tilbage.

Derudover har jeg en cd med billeder (billederne er ikke taget med mit kamera), kunne jeg godt tænke mig at omdøbe disse filer (da de ikke har navn som DSCxxxxx.jpg)
Avatar billede bertelbrander Novice
22. oktober 2003 - 22:53 #30
Du kan gemme følgene i en bat-fil i roden af dn mappe struktur:

@echo off
set Start=1
for /F %%I in ('dir /S /B /OD *.jpg') do call :process "%%I" "%%~dpI"
goto :eof

:Process
set Current=00000%Start%
set Current=%Current:~-5%
echo move %~1 %~2tmp%Current%.jpg
set /A Start=%Start%+1

Det bruger ingen parametre. Det vil omdøbe alle dine jpg-filer til tmpxxxxx.jpg. Hvor xxxxx vil være et fortløbende nummer, der starter ved 00001.

BEMÆRK: echo i næst sidste linie gør at kommandoen til omdøbning kun bliver udskrevet, IKKE udført. Kør først scriptet som det er, hvis det ser ud til at omdøbnings kommandoerne ser ud som ønsket, slettes echo i næst sidste linie og scriptet køres igen. Check lige to gange at det ser rigtigt ud, ellers ender du måske med noget rod (eller lav en backup af alle dine billeder).

Derefter retter du tmp i næst sidste linie til DSC og kører det igen. Derved vil alle filerne blive omdøbt til DSCxxxxx.jpg, hvor xxxxx stadig er et fortløbende nummer.
Det er nødvendigt at gøre det af to omgange, for at undgå overlappende filnavne.
Avatar billede nph12 Nybegynder
25. oktober 2003 - 14:46 #31
Jeg kan ikke rigtigt få det til at virke med de to bat-filer (har slettet echo i næstsidste linie). Bat-filer ikke fundet (cmd skriver: den angivne fil blev ikke fundet).

Jeg har taget backup af mine billeder.
Avatar billede bertelbrander Novice
25. oktober 2003 - 14:52 #32
Prøv lige at fjerne den første linie (@echo off) og kør det igen, så vi kan se hvor det går galt (hvilken linie der skriver "den angivne fil blev ikke fundet").
Jeg går ud fra at det er det seneste bat-script du prøver med.
Avatar billede nph12 Nybegynder
25. oktober 2003 - 16:36 #33
Ja, det er det sidste bat-script jeg bruger. Jeg tror lidt af problemet er, at mapperne hedder f.eks. xxx fødselsdag. Når jeg så kører bat-scriptet, hedder stien et eller andet før og så mappens navn, men bruger kun xxx (og bruger ikke xxx fødselsdag) og derved ikke kan finde billederne.
Avatar billede bertelbrander Novice
25. oktober 2003 - 17:07 #34
Kombinationen af mellemrum i stier/filnavne og bat-filer er lidt besværlig...
Følgende burde virke:

@echo off
set Start=1
for /F "tokens=*" %%I in ('dir /S /B /OD *.jpg') do call :process "%%I" "%%~dpI"
goto :eof

:Process
set Current=00000%Start%
set Current=%Current:~-5%
move %1 "%~2tmp%Current%.jpg"
set /A Start=%Start%+1
Avatar billede nph12 Nybegynder
25. oktober 2003 - 17:58 #35
Bat-filerne virker nu:-) Men hvilken rækkefølge tilskriver bat-filen billederne?

Hvad gør jeg nu, når jeg skal tilføje nye billeder til biblioteket?
Avatar billede bertelbrander Novice
25. oktober 2003 - 20:13 #36
/OD i dir commandoen skulle betyde at den ældste bliver "listet" først og dermed få nummer 1

For fremtiden kan du bruge en modificeret udgave af scriptet fra "20/10-2003 23:11:18" på de nye filer fra kameraet. DVS. bruge det script til at give dem numre derfra hvor du er kommet til.
Vi kan rette scriptet så selv det finder højeste nummer på nogen jpg-fil og så give de nye filer numre fra dette nummer.

Da du (så vidt jeg ved) flytter billeder ind i undermapper efter emne, er det måske ikke så vigtigt at de alle har unikke numre? Man kunne måske give billeder i en mappe numre fra 1 og op?

Det er måske også muligt at fortælle kameraet hvilket nummer det skal give det næste billede du tager?
Avatar billede nph12 Nybegynder
26. oktober 2003 - 23:47 #37
Det vil være helt fint, hvis vi kan rette scriptet fra "20/10-2003 23:11:18", så det selv finder det højeste nummer og giver de nye filer numre fra dette nummer.

Jeg synes at billederne skal havde unikke numre. Måske kunne vi give dem andre navne end DSCxxxxx.jpg, men i første omgang er dette godt nok.

Jeg har lige kigget på mit kamera og kan ikke lige se, hvordan jeg kan fortælle hvilke nummer det næste billede skal have. Har du nogen idé om, hvordan man gør det (hvis man kan)?
Avatar billede bertelbrander Novice
26. oktober 2003 - 23:56 #38
Jeg prøver at rette i scriptet fra 20/10.

Jeg kender ikke dit kamera, (bortset fra at det er et Sony Cypershot) men det har måske en fil du kan rette i?
Avatar billede nph12 Nybegynder
27. oktober 2003 - 12:35 #39
Ja, jeg har en fil, som jeg kan rette i. Hvad skal jeg gøre?
Avatar billede bertelbrander Novice
28. oktober 2003 - 00:48 #40
Åben filen i Nodepad, ret linie 41234 til:
fælasdkjfdsælf123209348k32l4kj3423493204982309480324 djfdsklfjdkfkkfkfkfkf

Eller... Jeg er ikke synsk, jeg ved ikke hvordan filen ser ud!
Ligner det noget fornuftigt når du prøver at åbne filen i Notepad, Internet Explorer, i ...?
Hvilken extension har filen?
Er der noget der ligner et filnavn i den?
Avatar billede nph12 Nybegynder
28. oktober 2003 - 16:42 #41
Jeg har lagt nogle billeder op på denne adresse:

http://www.nph12.frac.dk
(højre klik på hyperlink og valg gem destination som...)
Avatar billede nph12 Nybegynder
28. oktober 2003 - 16:44 #42
Jeg har prøvet at åbne en fil i notepad, men kan ikke lige finde noget som ligner et filnavn. Jeg kan dog finde dato og hvilke kamera billedet er taget med.
Avatar billede bertelbrander Novice
29. oktober 2003 - 00:09 #43
Jeg har lavet et lille script der gør følgende:

1: Løber alle Imgxxxxx.jpg filer igennem, i den mappe det er kørt fra OG alle undermapper, finder den med det største nummer.
2: Omdøber alle DSCxxxxx.jpg til Imgxxxxx.jpg, i den mappe det er kørt fra OG alle undermapper, hvor xxxxx er et fortløbende nummer der starter med det største nummer fra punkt et + 1.

Herved opnår vi at alle billeder får unikke fortløbende numre, og du undgår at skulle få dit kamera til at give billederne nye numre. Ulempen er så at billederne ikke hedder DSCxxxxx.jpg men Imgxxxxx.jpg.

Hver gang du har kopieret et sæt billeder fra kameraet til din PC kører du blot scriptet igen.

Husk at lave en backup af din billeder inden du kører scriptet. Jeg har IKKE lavet en echo der skal fjernes for at få scriptet til at omdøbe filerne i stedet for at udskrive kommandoen.

@echo off
setlocal

set DestPrefix=Img
set SrcPrefix=DSC
set First=0

for /F "tokens=*" %%I in ('dir /S /B %DestPrefix%?????.jpg 2^>1') do call :FindLargest "%%I"
set /A First+=1
echo First: %First%

for /F "tokens=*" %%I in ('dir /S /B /OD %SrcPrefix%?????.jpg') do call :ChangeName "%%I"
endlocal
goto :eof

:FindLargest
set Number=%~n1
set Number=%Number:~3,5%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if %Number% GTR %First% set /A First=%Number%
goto :eof

:ChangeName
set New=00000%First%
set New=%New:~-5%
Move %1 "%~dp1%DestPrefix%%New%.jpg"
set /A First+=1
Avatar billede nph12 Nybegynder
29. oktober 2003 - 17:19 #44
Har du prøvet at åbne et af mine billeder i notepad? Jeg tror at kameraet husker, hvilke nummer det er kommet til.

Det er fint at scriptet skriver, hvor mange billeder der ligger i mapperne. Jeg kunne oprette en mappe, hvor jeg ligger billederne fra kameraet over og navngive det derfra.

Jeg synes ikke rigtigt at kunne forstå rækkefølgen i billederne, efter jeg har omdøbt dem. Scriptet starter vel med at give det ældste billede det første nummer? Hvorfor må billederne ikke hedde DSCxxxxx.jpg?

Måske skal jeg bare bruge scriptet fra 22/10-2003 22:53:40? Det fjerner vel "huller" i rækkefølgen i billederne?

Flytter lige billederne fra backup-mappen over til min billedmappe og kigger på det helt fra starten.
Avatar billede bertelbrander Novice
29. oktober 2003 - 19:38 #45
Man kan IKKE redigere i jpg-billeder med notepad.

Kameraet må have et andet sted hvor det gemmer information om hvad den næste fil skal hedde, for at det kan finde ud af det, selvom du har slettet alle billeder fra kameraet.

Scriptet skulle gerne give det ældste billede det laveste nummer. Jeg er dog ikke sikker på at det virker hvis billederne ligger i forskellie undermapper, kikker lige på det senere i aften.

Grunden til at jeg ville give billederne et andet navn var at ungå at omdøbe alle billederne hver gang du kopierer billeder fra kameraet (men kun de nye), derved skulle vi gerne undgå at få rod i nummeringen.
Avatar billede nph12 Nybegynder
02. november 2003 - 16:43 #46
Har du fundet ud af noget med scriptet (det med undrmapperne)?
Avatar billede bertelbrander Novice
02. november 2003 - 23:18 #47
Har du checket om det er et problem? (Ja, jeg skal nok se på det.)
Avatar billede nph12 Nybegynder
03. november 2003 - 18:17 #48
Jeg har prøvet at lege lidt med de forskellige script, men det driller med de undermapper!

Jeg har en mappe med undermapper, hvor jeg kører scriptene fra. Så har jeg backupmappen, som jeg sammenligner med. Der er en undermapper i backupmappen med mine første billeder. Disse billeder bliver ikke angivet som de første, så der må være en fejl et eller andet sted!
Avatar billede bertelbrander Novice
04. november 2003 - 21:07 #49
Jeg har lavet et nyt script der burde løse problemet. Det gør følgende:

1: Sikrer at alle billeder har den rigtige dato/tid ved at køre filedate.exe (husk at gemme filedate.exe i samme mappe som du kører scriptet fra)

2: Laver en fil (temp1.temp) med navne på alle filer og deres dato/tid.

3: Sorterer linierne i denne fil så de er sorteret korrekt efter tid.

4: Omdøber alle filer til TTTxxxxx.jpg, hvor xxxxx er et fortløbende nummer der starter ved 1.

5: Omdøber alle filer fra TTTyyyyy.jpg til DSCyyyyy.jpg

Herved skulle alle filer have et unikt fortløbende nummer, med den korrekte nummerorden, uden huller i numreringen og filerne ender med at hedde DSCxxxxx.jpg

Husk at lave backup inden du kører scriptet.

@echo off
setlocal
if exist temp1.temp del temp1.temp
for /F "tokens=*" %%I in ('dir /S /B *.jpg') do filedate.exe -d %%I
set Start=1
for /F "tokens=*" %%I in ('dir /S /B *.jpg') do call :Process "%%I" "%%~tI"
for /F "tokens=2 delims=;" %%A in ('sort temp1.temp') do call :Renumber %%A
for /F "tokens=2 delims=;" %%A in ('sort temp1.temp') do call :FinalName %%A
endlocal
if exist temp1.temp del temp1.temp
goto :eof

:Process
for /F  "tokens=1-4 delims=- " %%A in (%2) do set dato=%%C%%B%%A:%%D
echo %dato% ; %1>>temp1.temp
goto :eof

:Renumber
set Number=00000%Start%
set Number=%Number:~-5%
set Name=%~dp1TTT%Number%%~x1
set /A Start=%Start% + 1
move %1 "%Name%"
goto :eof

:FinalName
set Name=%~n1
set Name=%Name:~3%
echo move "%~dp1TTT%Name%.%~x1 "%~dp1DSC%Name%.%~x1
Avatar billede nph12 Nybegynder
04. november 2003 - 22:38 #50
Hvad skal jeg skrive af kommando i punkt 1?
Avatar billede bertelbrander Novice
04. november 2003 - 23:00 #51
Du skal blot gemme scriptet i en .bat fil og køre det, så skulle det selv klare resten.
Avatar billede nph12 Nybegynder
05. november 2003 - 00:48 #52
Jeg har gemt scriptet i en .bat fil. Hvad gør jeg i punkt 1? Hvilken kommando skal jeg bruge til filedate.exe?
Avatar billede bertelbrander Novice
05. november 2003 - 19:45 #53
filedate.exe er det program jeg lavede til "22/10-2003 00:37:50".
Det kaldes af .bat-filen for at sikre at alle billeder har den rigtige dato/tid
Avatar billede nph12 Nybegynder
05. november 2003 - 20:06 #54
Nu forstår jeg det. Indtil videre ser det rigtigt ud. Dog mangler scriptet af udføre punkt 5!. Billederne hedder TTTyyyyy.jpg
Avatar billede bertelbrander Novice
05. november 2003 - 21:13 #55
Ups, den udskriver kommandoen til at udføre step 5, i stedete for at udføre den.
slet echo i sidste linie.
Avatar billede nph12 Nybegynder
05. november 2003 - 22:17 #56
Jeg har slettet echo i sidste linie, men får denne fejl:
Syntaksen i filnavnet, mappen eller disknavnet er forkert.
Avatar billede bertelbrander Novice
05. november 2003 - 22:34 #57
Den sidste linie skal være:
move "%~dp1TTT%Name%%~x1" "%~dp1DSC%Name%%~x1"
Avatar billede nph12 Nybegynder
06. november 2003 - 16:38 #58
Nu virker det :-). Kan vi ikke prøve at lave lidt sammen på de forskellige ting? Så det er også kan være til brug for andre her på eksperten. Jeg har eller helt styr på, hvad de forskellige script gør.

Jeg starter forfra og prøver at få styr på billederne. Først skal jeg vil sammeligne billederne om der er nogle som er ens, og derefter skal jeg navngive dem.

Når jeg har fået orden på mine billeder, så skal vi finde en metode hvor på jeg kan ligge de nye billeder over.
Avatar billede nph12 Nybegynder
07. november 2003 - 21:48 #59
Kan vi ikke lige tage det helt fra starten? Jeg har samlet alle mine billeder i undermapper til min hovedmappe som hedder billeder.

1) Først skal jeg sortere billederne, så der ikke er flere ens billeder.

2) Derefter skal jeg angive alle billederne.

3) Til sidste skal nye billeder navngives.

Til punkt 1 har jeg prøvet at køre programmet fra 16/09-2003 20:55:34, men der er stadigvæk ens filer. Gør jeg noget forkert?
Avatar billede bertelbrander Novice
08. november 2003 - 01:09 #60
1: Jeg har kikket lidt på checkdup men kan ikke rigtig se at der skulle være nogen problemer.

Du skrev at det skriver "Unable to open ...", det kunne tyde på at billedet er åbnet i et andet program, hvilket kan give problemer. Er det de samme billeder der giver denne fejl hver gang du kører programmet?

Hvis du har billeder som du mener er ens, men som checkdup ikke ser som ens, kan du prøve at bruge "fc /B image1.jpg image2.jpg" for at checke om de virkelig er ens.

Jeg har lavet en ny version af checkdup der laver nogle flere og bedre checks og som nægter at fortsætte hvis det møder nogen problemer:

http://home20.inet.tele.dk/midgaard/checkdup2.zip

2: Hvordan "angiver" man et billede?

3: Du vil have nye billeder til at få numre der følger lige efter det seneste? Har vi ikke lavet et script til det?
Avatar billede nph12 Nybegynder
08. november 2003 - 14:26 #61
Jeg prøver lige det nye script og melder lige tilbage, om det går bedre med det. Hvis der er to billeder som ser ud til at være ens, som pørver jeg med "fc /B image1.jpg image2.jpg". 

2) Jeg mente navngive billederne

3) Det kan godt være at du har lavet et script, men jeg kører lige lidt rundt i det for tiden.

Jeg har tænkt mig, når jeg har fået rette de "gamle" billeder, at oprette en mappe som hedder kamera. Så kam jeg tomme mine billeder i den mappe. Jeg skal jo vide, hvor lang talrækken er kommet og derefter navngive dem "rigtigt".
Avatar billede nph12 Nybegynder
08. november 2003 - 16:45 #62
Jeg forstår det ikke. Checkdup2 stopper med det samme ved "Unable to open ...". Jeg har lige genstartet computeren og har ikke startet andet end IE og CMD.
Avatar billede bertelbrander Novice
08. november 2003 - 19:23 #63
Har du lavet en ny list-fil til checkdup?
Findes den fil checkdup skriver at den ikke kan åbne?
Skriver checkdup andet end "Unable to open ..."?
Avatar billede nph12 Nybegynder
09. november 2003 - 09:26 #64
Jeg har lavet en ny list-fil. Den skriver ikke andet end "Unable to open ..." og så stien til filen. Billedet findes (har kigget efter). Det er det føste billede som står på list-filen. Stien til billedet indeholder å og ø, ved ikke om det har noget at sige.
Avatar billede bertelbrander Novice
09. november 2003 - 15:25 #65
Jo, det har noget at sige at der er æøå i filnavnene, det havde jeg slet ikke tænkt på.

Jeg skal lige have lavet en ny løsning, det bliver ikke før i aften.
Avatar billede bertelbrander Novice
10. november 2003 - 01:02 #66
Jeg har nu lavet en ny version af checkdup.

Denne bruger ikke en listfil, man angiver blot hvilke extensions der skal testes og om det skal ske i undermapper også.

For at checke alle .jpg filer i nuværende mappe og alle undermapper skriver man:

checkdup -s *.jpg

Hvis du vil spørges hver gang den finder ens billeder skal du tilføje -a

HUSK at lave en backup inden du kører programmet.

Du finder checkdup her:

home20.inet.tele.dk/midgaard/checkdup.zip
Avatar billede nph12 Nybegynder
10. november 2003 - 16:44 #67
Okay, nu kører det. Der er ingen problemer nu med programmet. Dog har jeg nogle billeder som ser ens ud (taget på samme tidspunkt og har samme filstørrelse).

Jeg har checket det ved at bruge:
"fc /B image1.jpg image2.jpg"

Det ene billedet er et som er fra kameraet og det andet er et "recovery" billede. Der er kun 3-4 par af sådanne billeder, så dem sletter jeg manualt.

Jeg har prøvet at navngive billederne (efter det du skrev: 04/11-2003 21:07:21, men får dette meddelse (har rettet den sidste linie i scriptet):

Den angivne fil blev ikke fundet.

Kunne det også være noget med æøå at gøre?
Avatar billede bertelbrander Novice
10. november 2003 - 21:35 #68
Du skal rette sidste linie til:

move "%~dp1TTT%Name%%~x1" "%~dp1DSC%Name%%~x1"

dvs indsætte to gange " efter %x1 og fjerne to gange '.'

Hvis ikke det hjælper så skriv echo foran og se hvad den skriver eller post det her.
Avatar billede nph12 Nybegynder
10. november 2003 - 22:26 #69
Jeg har rettet scriptet, men får stadigvæk "Den angivne fil blev ikke fundet."

@echo off
setlocal
if exist temp1.temp del temp1.temp
for /F "tokens=*" %%I in ('dir /S /B *.jpg') do filedate.exe -d %%I
set Start=1
for /F "tokens=*" %%I in ('dir /S /B *.jpg') do call :Process "%%I" "%%~tI"
for /F "tokens=2 delims=;" %%A in ('sort temp1.temp') do call :Renumber %%A
for /F "tokens=2 delims=;" %%A in ('sort temp1.temp') do call :FinalName %%A
endlocal
if exist temp1.temp del temp1.temp
goto :eof

:Process
for /F  "tokens=1-4 delims=- " %%A in (%2) do set dato=%%C%%B%%A:%%D
echo %dato% ; %1>>temp1.temp
goto :eof

:Renumber
set Number=00000%Start%
set Number=%Number:~-5%
set Name=%~dp1TTT%Number%%~x1
set /A Start=%Start% + 1
move %1 "%Name%"
goto :eof

:FinalName
set Name=%~n1
set Name=%Name:~3%
move "%~dp1TTT%Name%%~x1" "%~dp1DSC%Name%%~x1"
Avatar billede bertelbrander Novice
10. november 2003 - 22:54 #70
Hvis du har filer der ikke hedder DSCxxxxx.jpg (
  Hvis du har prøvet at køre scriptet igen (
    Hvilken linie skriver "Den angivne fil blev ikke fundet?
    Fjern @echo off, kør scriptet igen og copy&paste kommandoen
  ) Ellers (
    Prøv at Kør scriptet igen
    Hvis det stadig fejler (
      Gå til starten
    ) ellers (
        Godt
    )
  )
) Ellers (
  Hvilken linie skriver "Den angivne fil blev ikke fundet?
  Fjern @echo off, kør scriptet igen og copy&paste kommandoen
)
Avatar billede nph12 Nybegynder
10. november 2003 - 23:37 #71
Jeg har fjernet de filer som ikke hedder DSCxxxxx.jpg, men får stadigvæk "Den angivne fil blev ikke fundet", så det må være noget med mappenavnet at gøre (æøå).

Bagefter jeg har scriptet fra 10/11-2003 22:26:59 er der nogle filer som hedder DSCxxxxx.jpg og andre TTTxxxxx.jpg. Jeg forstår det ikke! Jeg kører scriptet som det ser ud 10/11-2003 22:26:59.
Avatar billede bertelbrander Novice
10. november 2003 - 23:55 #72
Jeg har prøvet med mapper der hedder "æøå . æøå . ÆØÅ .                ÆÆØØÅÅ" med filer der hedder ÆØÅ . æøå.jpg, og kan ikke få det til at fejle.

Fjern @echo off, kør scriptet igen og copy&paste kommandoen der fejler (og helst nogle få liner før kommandoen).
Avatar billede nph12 Nybegynder
11. november 2003 - 16:03 #73
ALLE billederne hedder DSCxxxxx.jpg inden jeg kører scriptet (har kigget billederne igennem). Jeg kan se, at der er et "hul" imellem DSC00011 til DSC00015, det er måske det som der driller.

E:\Dokumenter\Billeder>set Name=DSC00011

E:\Dokumenter\Billeder>set Name=00011

E:\Dokumenter\Billeder>move "E:\Dokumenter\Billeder\Dåb\TTT00011.JPG" "E:\Dokume
nter\Billeder\Dåb\DSC00011.JPG"

E:\Dokumenter\Billeder>pause
Tryk på en vilkårlig tast for at fortsætte . . .

E:\Dokumenter\Billeder>call :FinalName  "E:\Dokumenter\Billeder\Dåb\DSC00015.JPG
"

E:\Dokumenter\Billeder>set Name=DSC00015

E:\Dokumenter\Billeder>set Name=00015

E:\Dokumenter\Billeder>move "E:\Dokumenter\Billeder\Dåb\TTT00015.JPG" "E:\Dokume
nter\Billeder\Dåb\DSC00015.JPG"
Den angivne fil blev ikke fundet.

E:\Dokumenter\Billeder>pause
Tryk på en vilkårlig tast for at fortsætte . . .
Avatar billede bertelbrander Novice
11. november 2003 - 20:36 #74
Undskyld, jeg er en torsk!

Vender tilbage senere.
Avatar billede bertelbrander Novice
12. november 2003 - 00:39 #75
Utroligt at man kan lave så mange fejl i noget der så simpelt.

Det betyder ikke noget hvad filerne hedder inden du kører scriptet, de komer til at hedde DSCxxxx.jpg bagefter.

@echo off
setlocal
if [%Temp%]==[] (
  set TempFile1=temp1.temp
  set TempFile2=temp2.temp
) else (
  set TempFile1=%Temp%\temp1.temp
  set TempFile2=%Temp%\temp2.temp
)

if exist %TempFile1% del %TempFile1%
if exist %TempFile2% del %TempFile2%

for /F "tokens=*" %%I in ('dir /S /B *.jpg') do filedate.exe -d %%I
set Start=1
for /F "tokens=*" %%I in ('dir /S /B *.jpg') do call :Process "%%I" "%%~tI"
for /F "tokens=2 delims=;" %%A in ('sort %TempFile1%') do call :Renumber %%A
for /F "delims=;" %%A in (%TempFile2%) do call :FinalName "%%A"
if exist %TempFile1% del %TempFile1%
if exist %TempFile2% del %TempFile2%

endlocal
goto :eof

:Process
for /F  "tokens=1-4 delims=- " %%A in (%2) do set dato=%%C%%B%%A:%%D
echo %dato% ; %1>>%TempFile1%
goto :eof

:Renumber
set Number=00000%Start%
set Number=%Number:~-5%
set Name=%~dp1TTT%Number%%~x1
set /A Start=%Start% + 1
move %1 "%Name%"
echo %Name%>> %TempFile2%
goto :eof

:FinalName
set Name=%~n1
set Name=%Name:~3%
move "%~dp1TTT%Name%%~x1" "%~dp1DSC%Name%%~x1"
Avatar billede nph12 Nybegynder
12. november 2003 - 21:58 #76
Det ser rigtigt ud nu :-). Nu har jeg alle de "gamle" billeder på plads. Hvad gør jeg med de billeder, som jeg tager fremover? Kan man lave et system, så de nye billeder bliver navngivet efter de "gamle" billeder?
Avatar billede bertelbrander Novice
12. november 2003 - 23:43 #77
Man kunne let lave et system der finder den fil med det højeste nummer, og giver de nye file numre herfra samtidig med at de flyttes.

Så vidt jeg husker har jeg postet flere løsninger der finder det højeste nummer, og det burde være overkommeligt at omdøbe filene samtidig med at de flyttes, måske din næste opgave?
Avatar billede nph12 Nybegynder
13. november 2003 - 00:06 #78
Jeg kan bruge scriptet fra 20/10-2003 23:11:18 til at omdøbe billederne i mappen kamera, men fandt vi en måde, hvor på man kunne finde højeste nummer (jeg kan ikke lige huske det)?
Avatar billede bertelbrander Novice
13. november 2003 - 00:29 #79
F.ex "29/10-2003 00:09:01"
Avatar billede nph12 Nybegynder
17. november 2003 - 15:32 #80
Jeg er ikke helt med! Man omdøber jo med "29/10-2003 00:09:01" til Imgxxxxx.jpg. Nu når vi har fået de "gamle" billeder på plads, så skal de nye billeder også hedde DSCxxxxx.jpg.

Først skal finde finde de højeste nummer fra de "gamle" billeder, så rækkefølgen fortsættes. Derefter skal billederne omdøbes! Hvordan gør jeg det?

Jeg har en mappe som hedder "billeder" til mine "gamle" billeder. Jeg har en mappe som hedder "kamera" til de nye billeder.
Avatar billede nph12 Nybegynder
19. november 2003 - 10:55 #81
Hvordan gør jeg disse ting (17/11-2003 15:32:06)?
Avatar billede bertelbrander Novice
19. november 2003 - 19:41 #82
Du skal lave om på scriptet fra "29/10-2003 00:09:01".

Først finder det den IMGxxxxx.jpg fil der har det højeste nummer, dette skal laves om så den finder den DSCxxxxx.jpg fil der har det højeste nummer.

Derefter omdøber det alle DSCxxxxx.jpg til IMGxxxxx.jpg, hvor den starter fra det nummer den fandt under punkt 1. Dette skal laves om så den flytter filerne fra kameraet OG giver dem et nyt nummer.
Avatar billede nph12 Nybegynder
20. november 2003 - 16:17 #83
Okay. Nu har jeg oprettet scriptet fra "29/10-2003 00:09:01" og lagt det i mappen kamera. Hvad gør jeg nu?

Da rækkefølgen skal fortsættes fra de "gamle" billeder, skal de nye fra kameraet navngives derfra. F.eks. det højeste nummer fra de "gamle" billeder er DSC00512.jpg skal de nye billeder fra kameraet navngives fra DSC00513.jpg og op efter.
Avatar billede nph12 Nybegynder
22. november 2003 - 09:40 #84
Hvad gør jeg nu?
Avatar billede bertelbrander Novice
22. november 2003 - 15:03 #85
Har du prøvet at ændre det som beskrivet i "19/11-2003 19:41:17"?

Jeg kan godt lave det, men jeg tror at du kan det meste af det selv. Prøv at ændre scriptet, hvis der opstår problemer, så post det du har lavet, så vil jeg prøve at hjælpe.
Avatar billede nph12 Nybegynder
23. november 2003 - 19:11 #86
Har du læst det jeg skrev "20/11-2003 16:17:31"? Jeg kan ikke lige se, hvad jeg skal rette, så det er nok bedst hvis du gør det. Det vil være en meget stor hjælp!
Avatar billede bertelbrander Novice
24. november 2003 - 20:48 #87
Jeg har besluttet at jeg ikke vil lave flere scripts til dig, før du har gjort et ærligt forsøg selv.

Start med at analysere scriptet fra "29/10-2003 00:09:01", find ud af hvad det gør og hvordan det gør det. Oversæt scriptet til pseudo-sprog.

Derefter laver du koden til det du vil have i pseudo-sprog.

Herefter sammenligner du de to pseudo-scripts, du vil nok kunne se at det de gør er stort set det samme.

Til slut ændrer du scriptet, det er faktisk ikke særligt svært.

Hvis du støder ind i problemer er du selvfølgelig velkommen til at spørge.
Avatar billede nph12 Nybegynder
24. november 2003 - 22:28 #88
Her er lidt pseudo-sprog. Jeg har stødt lidt ind i nogle problemer (se *ved ikke*).

Visning fra
kommandoen SETLOCAL indstiller værdien af ERRORLEVEL

Sæt DestPrefix=Img
Sæt SrcPrefix=DSC
Sæt First=0

for /F (Analysere outputtet fra en kommando) "tokens=*" (tokens angiver, hvilke tokens fra hver linje der skal overgives til For-indholdet for hver gentagelse) %%I in (variabel i) ('dir /S/B %DestPrefix%?????.jpg 2^>1') (dir/viser filer i den angivne mappe og alle undermapper/Bruger enkelt format Indsætter variablen Img5ukendtetegn.jpg *ved ikke*) do call :FindLargest "%%I" (så kald :Findlargest variablen "%%I")
set /A (sæt udtryk) First+=1 (ligger en til First)
echo First: %First% (viser First: variablen)


for /F (Analysere outputtet fra en kommando) "tokens=*" (tokens angiver, hvilke tokens fra hver linje der skal overgives til For-indholdet for hver gentagelse) %%I in (variabel i) ('dir /S/B %SrcPrefix?????.jpg 2^>1') (dir/viser filer i den angivne mappe og alle undermapper/Bruger enkelt format/Viser filer i sorteret rækkefølge som er dato/tid (ældste først)  Indsætter variablen DSC5ukendtetegn.jpg *ved ikke*) do call :ChangeName "%%I" (så kald :ChangeName variablen "%%I")
endlocal (ændre til standardindstillinger af SETLOCAL)
goto :eof (gå til sidst af filen)

:FindLargest
Set Number=%~n1 (sætter Number lig med *ved ikke*)
Set Number=%Number:~3,5% (sætter Number lig med variablen Number *ved ikke*)
if[%Number:~0,1%]==[0] set Number=%Number:~1% (hvis variablen %Number *ved ikke* lig med 0 sæt Number lig med variablen Number start med tegn 2) 
if[%Number:~0,1%]==[0] set Number=%Number:~1% (hvis variablen %Number *ved ikke* lig med 0 sæt Number lig med variablen Number start med tegn 2)
if[%Number:~0,1%]==[0] set Number=%Number:~1% (hvis variablen %Number *ved ikke* lig med 0 sæt Number lig med variablen Number start med tegn 2)
if[%Number:~0,1%]==[0] set Number=%Number:~1% (hvis variablen %Number *ved ikke* lig med 0 sæt Number lig med variablen Number start med tegn 2)
if %Number% GTR %First% set/A First=%Number% (hvis variablen %Number% er større end variablen %First% så sæt First lig med variablen %Number%)
goto :eof (gå til sidst af filen)

:ChangeName
set New00000%First% (sætter New lig med New00000 plus variablen %First%)
set New=%New:~5% (sætter Nem lig med variablen %New *ved ikke*)
Move %1 "%~dp1%Destprefix%%New%.jpg" (flytter den første variabel "*ved ikke* Img plus variablen &New.jpg")
set /A (sæt udtryk) First+=1 (ligger en til First)
Avatar billede bertelbrander Novice
25. november 2003 - 00:26 #89
Ikke nogen dårlig gennemgang af scriptet!

1: Jeg tror lige du skal læse om setlocal/endlocal igen.

2: tokens=* betyder alle tokens, og bruges i dette tilfælde for at undgå at for-løkken splitter filnavnet op, hvis det indeholder mellemrum.

3: Kommandoer kan lave to slags output; "stdout" og "stderr". Den første har nummer 1, den anden har nummer 2. Hvis man skriver 'dir *' udskrives normal text til stdout/1, men hvis der ikke er nogen filer anser dir det for at være en fejl og vil udskrive "File Not Found" til 2/stderr.
Når man skriver 'dir >log.txt' betyder det at stdout bliver puttet i log.txt, skriver man 2>dir.txt betyder det at stderr bliver puttet i log.txt, hvis man vil have begge dele i samme fil skriver man 'dir >log.txt 2>&1'. Bruger man dir >nul sendes outputtet fra dir kommandoen ud i "the big void".
I dir kommandoerne i scriptet er vi ikke interesseret i fejlbeskederne, så dem sender vi til nul. Da det står inden for en kommando til en for-løkke er vi nødt til at bruge "2^>nul" for at undgå at kommandofortolkeren forsøger at være smart med vores ">" (^ er en "escape" karakter der betyder at den næste karakter skal tages bogstaveligt). Der er indsneget sig en fejl i scriptet, der står "2^>1" der skulle stå "2^>nul", ellers vil den putte fejlbeskeder i en fil kaldet 1.

4: Hvis du læser om call kommandoen kan du se at %~n1 betyder filnavnet på %1 uden path eller extension. Dvs c:\whatever\dsc00001.jpg bliver til dsc00001.

5: Fra set kommandoen kan du se at %Number:~3,5% betyder; tag de 5 karakterer der starter fra den 3. position af %Number%. Så hvis %Number% er DSC12345 så er %Number:~3,5% 12345

6: Når man regner med set /A kommandoen kan man angive tal som:
A: decimal tal, dvs. normale base 10 tal
B: hex, dvs. base 16, disse skrives som 0x1234
C: octal, dvs. base 8, disse skrives som 0123

Hvis man skriver "set /A 0x1234" i en kommando-prompt kan man se at det er 4660, og "set /A 01234" giver 668.

Hvis en fil hedder DSC00123 vil vi have fat i tallet 123 decimalt, så vi er nødt til at fjerne de forreste 0'er (ellers vil den tro at det er 0123 octalt).

%Number:~0,1% er det første tegn i %Number%, %Number:~1% er alt i %Number% undtagen det første tegn, så linien:
if [%Number:~0,1%]==[0] set Number=%Number:~1%
checker om første tegn er et 0, hvis det er det så fjernes det.

7: I ChangeName skal vi have lavet et tal ud fra %First% på fem cifre, hvor de første cifre er 0 hvis %First% er på mindre en 5 cifre. Det gøres i to trin:
A: Sæt fem 0'er ind forest (set New=00000%First%)
B: Vælg de sidste fem cifre (set New=%New:~-5%)

8: Fra studiet af call kommandoen ved vi at %~dp1 betyder drev+path for %1, så hvis %1 er c:\kamera\kkk012345.jpg, så er %~dp1 c:\kamera\
Derved ser vi at "%~dp1%DestPrefix%%New%.jpg" betyder:
Drev+Path for %1 + %DestPrefix% + Det tal vi lavede i 7: + .jpg

9: Move flytter i dette tilfælde fil. Det er den kommando der udfører det endelige arbejde.

10: goto :eof betyder ganske rigtigt "gå til sidst af filen", men det er nok lettere at tænke på det som "returner fra funktion"/"afslut funktion"/"afslut script".


Ud fra dette kan/bør du lave en beskrivelse der på mere normalt dansk forklarer hvad scriptet gør, man kunne f.ex. beskrive funktionen :FindLargest som:

Sæt Number til at være filnavnet af parameteren/filnavnet
Sæt Number til at være karakter 3-8 af %Number%
Fjern eventuelle initielle 0'er i %Number%
Hvis %Number% er større end %First% så sæt First til at være %Number%

Når du har denne beskrivelse på plads kan du lave en tilsvarende for det du vil have lavet. Du burde så kunne se hvad der skal ændres i scriptet for at det gør det du vil.
Avatar billede nph12 Nybegynder
25. november 2003 - 17:49 #90
Jeg har lige printet din gennemgang ud og har lige tænkt mig, at læse den et par gange for at få fat i det sidste.

Jeg skal nok prøve at lave en beskrivelse på normalt dansk som forklare, hvad scriptet gør og hvad jeg vil havde det til at gøre.

Jeg vil bare lige være 100 % sikkert på, når jeg har ændret scriptet at jeg kan få det til dette:

"Da rækkefølgen skal fortsættes fra de "gamle" billeder, skal de nye fra kameraet navngives derfra. F.eks. det højeste nummer fra de "gamle" billeder er DSC00512.jpg skal de nye billeder fra kameraet navngives fra DSC00513.jpg og op efter."

Her tænker jeg på, at de "gamle" billeder jeg har liggende i mapper, kun bliver kørt igennem for at finde det højeste nummer (de skal jo ikke navngives, da de har fået et rigtigt navn). Hvis den ligger sammen med de "gamle" billeder, tager den jo kamera mappen med (det skal den jo ikke). Hvor skal min kamera mappe ligge? Eller kan man få scriptet til at lede efter det højeste nummer i alle mapper undtagen mappen kamera?

De nye billeder bliver vel navngivet DSC (og ikke img)?
Avatar billede bertelbrander Novice
25. november 2003 - 20:51 #91
Scriptet checker pt. alle IMGxxxxx.jpg filer og finder det højeste nummer. Det skal laves om, så det finder det højeste nummer for DSCxxxxx.jpg filer.

Jeg forstiller mig at du derefter bruger dette nummer til at navngive filerne når du flytter dem fra kameraet OG omdøber dem. De kan stadig hedde DSCxxxxx.jpg, men de får et nyt nummer. På den måde behøver vi ikke tage speciel hensyn til kamera mappen.
Avatar billede nph12 Nybegynder
25. november 2003 - 23:44 #92
Jeg har fundet ud af, hvordan jeg finder det højeste nummer:

@echo off
setlocal

set DestPrefix=DSC
set First=0

for /F "tokens=*" %%I in ('dir /S /B %DestPrefix%?????.jpg 2^>nul') do call :FindLargest "%%I"
set /A First+=1
echo First: %First%
pause

:FindLargest
set Number=%~n1
set Number=%Number:~3,5%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if %Number% GTR %First% set /A First=%Number%
goto :eof

Med det kan jeg omdøbe billederne med scriptet fra "25/10-2003 17:07:43".
Avatar billede nph12 Nybegynder
28. november 2003 - 17:14 #93
Okay, det virker fint med at først at finde det højeste nummer og så derefter omdøbe dem.

Nu skal vi bare få scriptet fra "29/10-2003 00:09:01" til at gøre det samme. Jeg forstår stadigvæk ikke, hvor min mappe kamera skal/må ligge. Nu har jeg jo alle mine billeder liggende i mappen billeder, må mappe kamera også ligge der? Kommer scriptet ikke til at tælle de filer, som ligger i mappen kamera med?

Eller kan man lave en undtagelse, så scriptet finder det højeste nummer i undermapperne til mappen billeder med undtagelse af mappen kamera?

Hvad skal jeg nu? Skal jeg lave en beskrivelse af, hvordan det nye script skal gøre/se ud?
Avatar billede bertelbrander Novice
29. november 2003 - 16:44 #94
Du kan godt lave det så den springer filer i kamera mappen over.
Tilføj følgende til starten af FindLargest funktionen:

echo %1 |find "kamera" >nul
if not errorlevel 1 echo skipping: %1& goto :eof

Det der sker her er at vi sætter kommandoen/programmet find til at lede efter kamera i filnavnet, hvis den ikke finder det sætter den errorlevel til 1.
I næste linie checkes der så om errorlevel er 1, hvis ikke skippes filen.

Husk at sætte en goto :eof ind inden :FindLarget labelen.

Ja, det ville nok være en god ide at lave en beskrivelse af det du vil have lavet i pseudo-sprog.
Avatar billede nph12 Nybegynder
01. december 2003 - 19:43 #95
Nu skulle den del af scriptet være på plads. Jeg laver lige en beskrivelse her en af dagene.

@echo off
setlocal

set DestPrefix=DSC
set First=0

for /F "tokens=*" %%I in ('dir /S /B %DestPrefix%?????.jpg 2^>nul') do call :FindLargest "%%I"
set /A First+=1
ClS
echo First: %First%
goto :eof

:FindLargest
echo %1 |find "kamera" >nul
if not errorlevel 1 echo skipping: %1& goto :eof
set Number=%~n1
set Number=%Number:~3,5%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if %Number% GTR %First% set /A First=%Number%
goto :eof
Avatar billede nph12 Nybegynder
01. december 2003 - 23:46 #96
Jeg tror dette virker, men kigger lige igen på det i morgen.

setlocal

set DestPrefix=DSC
set First=0

for /F "tokens=*" %%I in ('dir /S /B %DestPrefix%?????.jpg 2^>nul') do call :FindLargest "%%I"
set /A First+=1
echo First: %First%
goto :Start

:FindLargest
echo %1 |find "kamera" >nul
if not errorlevel 1 echo skipping: %1& goto :eof
set Number=%~n1
set Number=%Number:~3,5%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if %Number% GTR %First% set /A First=%Number%
goto :eof

:Start
set Start=%First
for /F "tokens=*" %%I in ('dir /S /B /OD *.jpg') do call :process "%%I" "%%~dpI"
goto :eof

:Process
set Current=00000%Start%
set Current=%Current:~-5%
move %1 "%~2DSC%Current%.jpg"
set /A Start=%Start%+1
Avatar billede bertelbrander Novice
02. december 2003 - 22:22 #97
I funktioinen Start mangler du en % efter First, det skal være:

set Start=%First%

Det er normalt ikke nogen god ide at have både en variable og en label/funktion til at hedde det samme (Start).
Avatar billede nph12 Nybegynder
02. december 2003 - 22:59 #98
Okay. Der er også en anden fejl. Scriptet skal jo give billeder nummer efter det højeste nummer i de andre mapper, men når jeg kører scriptet bliver billederne i kamera-mappen større og større (og de andre mapper).

Det er jo kun billederne i kamera-mappen som skal omdøbes, så scriptet skal rettes så det gør det.
Avatar billede bertelbrander Novice
02. december 2003 - 23:33 #99
Jeg går ud fra at det er numrene på billederne i kamera mappen der bliver større og større. Hvad sker der med numrene på de andre.

Finder den ud at hoppe over billederne i kamera mappen når den kører loopen med :FindLargest, dvs skriver den "skipping z:\whatever\kamera" ?

Du kan lave loopen i :Start om, så den kun kører for billederne i z:\whatever\kamera, ved at bruge:

for /F "tokens=*" %%I in ('dir /S /B /OD z:\whatever\kamera\*.jpg') do call :process "%%I" "%%~dpI"
Avatar billede nph12 Nybegynder
03. december 2003 - 00:20 #100
Nu ser det ud til at virke :-). Scriptet skriver i stil med "skipping z:\whatever\kamera". Hvad skal jeg kalde labelen i stedet for start?

@echo off
setlocal

set DestPrefix=DSC
set First=0

for /F "tokens=*" %%I in ('dir /S /B %DestPrefix%?????.jpg 2^>nul') do call :FindLargest "%%I"
set /A First+=1
echo First: %First%
goto :Start

:FindLargest
echo %1 |find "kamera" >nul
if not errorlevel 1 echo skipping: %1& goto :eof
set Number=%~n1
set Number=%Number:~3,5%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if %Number% GTR %First% set /A First=%Number%
goto :eof

:Start
set Start=%First%
for /F "tokens=*" %%I in ('dir /S /B /OD E:\Dokumenter\Billeder\kamera\*.jpg') do call :process "%%I" "%%~dpI"
goto :eof

:Process
set Current=00000%Start%
set Current=%Current:~-5%
move %1 "%~2DSC%Current%.jpg"
set /A Start=%Start%+1
Avatar billede bertelbrander Novice
03. december 2003 - 00:53 #101
:Start looper over alle .jpg billeder i mappen, så man kunne kalde den :ProcessFolder og så omdøbe :Process til :ProcessFile

Det er måske heller ikke logisk at tælleren Start hedder Start, man kunne kalde den NextNumber. First kunne af samme grund hedde MaxNumber

Hvis jeg kun har en eller to labels i et script plejer jeg at kalde dem :Process eller DoIt, men når man har flere labels er det vigtigt at give dem beskrivende navne.
Avatar billede nph12 Nybegynder
03. december 2003 - 17:06 #102
Sådan?
Er der nogen forskel på, om man bruger move eller ren til at omdøbe filer?

@echo off
setlocal

set DestPrefix=DSC
set MaxNumber=0

for /F "tokens=*" %%I in ('dir /S /B %DestPrefix%?????.jpg 2^>nul') do call :FindLargest "%%I"
set /A First+=1
echo MaxNumber: %MaxNumber%
goto :ProcessFolder

:FindLargest
echo %1 |find "kamera" >nul
if not errorlevel 1 echo skipping: %1& goto :eof
set Number=%~n1
set Number=%Number:~3,5%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if [%Number:~0,1%]==[0] set Number=%Number:~1%
if %Number% GTR %MaxNumber% set /A MaxNumber=%Number%
goto :eof

:ProcessFolder
set NextNumber=%MaxNumber%
for /F "tokens=*" %%I in ('dir /S /B /OD E:\Dokumenter\Billeder\kamera\*.jpg') do call :ProcessFile "%%I" "%%~dpI"
goto :eof

:ProcessFile
set Current=00000%NextNumber%
set Current=%Current:~-5%
move %1 "%~2DSC%Current%.jpg"
set /A NextNumber=%NextNumber%+1
Avatar billede bertelbrander Novice
03. december 2003 - 19:16 #103
Fint.

ren kan ikke flytte filer til en anden mappe.
Avatar billede nph12 Nybegynder
03. december 2003 - 20:36 #104
Scriptet kører fint :-)

Takker rigtigt mange gange for hjælpen!

Jeg lukker spørgsmålet.
Avatar billede nph12 Nybegynder
04. december 2003 - 17:16 #105
Vil du have point denne gang eller skal jeg selv tage dem?
Avatar billede bertelbrander Novice
04. december 2003 - 23:33 #106
Jeg vil stadig ikke have point.

Du tog pointene "17/09-2003 17:23:12"
Avatar billede nph12 Nybegynder
05. december 2003 - 19:09 #107
Ups, det havde jeg lige glemt!
Avatar billede nph12 Nybegynder
22. april 2004 - 22:14 #108
Jeg har nogle billeder, hvor jeg har to af hver slags. Jeg bruger checkdup til at sortere i disse billeder. Programmet skriver "deliting", men sletter ikke filen.
Avatar billede bertelbrander Novice
22. april 2004 - 23:56 #109
Jeg har lavet en ny version der laver nogle check når den forsøger at slette en fil, prøv den:

http://home20.inet.tele.dk/midgaard/checkdup3.zip

Det er den version der ikke skal bruge en list fil, du kører den blot med:

checkdup [-s] [-a] [*.jpg]

-s bruges for at checke undermapper.
-a bruges hvis du vil spørges inden den sletter.
Du kan angive hvilke ekstensions der skal checkes, default er alt (*.*)

Hvis den fejler skriver den noget i stil med:
Same: D:\Program\nph12\ÆÆØØÅÅ.ææøøåå D:\Program\nph12\æ-å, deliting D:\Program\nph12\æ-å
Failed to delete D:\Program\nph12\æ-å
Status: Read-Only, 8100

Hvis du ser det så cut-&-paste beskeden her.
Avatar billede nph12 Nybegynder
23. april 2004 - 23:07 #110
E:\Dokumenter\Billeder>checkdup -a -s *.*
Found: 945 files
Checking: 222
Same: E:\Dokumenter\Billeder\Thomas' Fødselsdag\DSC00308.JPG E:\Dokumenter\Bille
der\Billeder fra Allan\DSC00307.JPG
1: Delete E:\Dokumenter\Billeder\Thomas' Fødselsdag\DSC00308.JPG
2: Delete E:\Dokumenter\Billeder\Billeder fra Allan\DSC00307.JPG
2
Failed to delete E:\Dokumenter\Billeder\Billeder fra Allan\DSC00307.JPG
Status: Read-Only, 8100
Avatar billede bertelbrander Novice
23. april 2004 - 23:47 #111
Ja, det tyder jo på at "E:\Dokumenter\Billeder\Billeder fra Allan\DSC00307.JPG" er Read-Only. Programmet kan ikke slette disse, så du bliver nødt til at fjerne Read-only attributten med attrib kommandoen (attrib -R /S).

Jeg undersøger lige om jeg kan få programmet til at slette Read-only filer.
Avatar billede bertelbrander Novice
24. april 2004 - 00:27 #112
Jeg har lavet en ny version:

http://home20.inet.tele.dk/midgaard/checkdup4.zip

Den har fået en -r switch der skal sættes hvis du vil have den til at slette filer der er mærket Read-Only
Avatar billede nph12 Nybegynder
04. maj 2004 - 16:59 #113
Kan du ikke lægge den sidst version af checkdup ud igen (da de sidste indlæg mangler efter at eksperten har været nede)?
Avatar billede bertelbrander Novice
04. maj 2004 - 19:36 #114
Linket er her:
http://home20.inet.tele.dk/midgaard/checkdup4.zip

Den har fået en -r switch der vil få den til at forsøge at slette filer der er mærket ReadOnly.

Hvis den fejler vil den skrive hvorfor, hvis den gør det så prøv at cut&paste beskeden her.
Avatar billede nph12 Nybegynder
05. maj 2004 - 21:30 #115
Jeg har fået det til at køre:-)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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