Avatar billede nph12 Nybegynder
23. oktober 2003 - 19:59 Der er 68 kommentarer og
1 løsning

Bat programmering del 2

Hej
Her er fortsættelsen til Bat programmering del 1 (http://www.eksperten.dk/spm/398456).

Dette spørgsmål er til at hjælpe og komme med tips til, hvordan man laver disse bat-scipts:

1: Lav et bat-script der kopierer billeder fra et digital kamera til harddisk. Det skal lave en mappe med dags dato som navn og kopiere billderne til denne mappe.

2: Lav et script der rydder op i en mappe med billeder, den skal lave under-mapper ud fra datoerne på billederne og flytte billederne til disse mapper.

3: Lav et script der giver filer navne efter den dag de er gemt.
 
Disse scripts laves til windows2000 (de fleste ting der bruges i disse scripts ikke virker på Win95/98/ME)

ALLE er mere end velkommen til at deltage!
Avatar billede tfa_dk Nybegynder
23. oktober 2003 - 23:37 #1
Spørgsmål 1 kan måske laves med .bat eller .cmd filer men 2 og 3 vil kræve hjælp af ikke standard dos kommandore.

Brug kiXtart eller vbscript til den type opgaver.
Avatar billede bertelbrander Novice
23. oktober 2003 - 23:55 #2
Hvis man har billeder på kameraet til at ligge i g:\hh\ og vil have dem til at ligge i en ny undermappe, der skal hedde sommer, under c:\kamera, kan man lave følgende i en bat-fil:

md c:\kamera\sommer
copy g:\hh\* c:\kamera\sommer

Hvis man nu vil have mappen til at hedde "to 23-10-2003" (fordi det er dagen i dag), kan man bruge %date% i stedet for sommer i ovenstående.
date er en slags variabel der altid er dags dato. Normale variable kan ses vha. set kommandoen, det kan man ikke med date. Man kan heller ikke ændre %date% med set kommandoen som man kan med andre variable.

Nu er der jo nok en eller anden der spørger hvilken forskel der er på date og %date%, svaret er at date er navnet på variablen og %date% er indholdet af variablen.

En eller anden vil sikkert ønske sig at give mappen navnet "23-10-2003", dvs uden ugedag, så den må vi lige have fjernet. Det kan man gøre på mange måder, f.ex. kan man fjerne de først 3 tegn i %date%, det vil komme til at se sådan ud: %date:~3%. Hvis ikke det står helt klart hvorfor, vil det være en god ide at køre kommandoen "help set" i en kommando prompt (eller kikke efter set i Start -> Help). For at se at det virker kan man køre kommandoen "echo %date:~3%" i en kommando prompt. Så for at få mappen til at hedde 23-10-2003 erstatter man blot sommer med %date:~3% i eksemplet ovenfor.

Det kunne også tænkes at nogen ville ønske at kalde mappen for 23102003, dvs fjerne både ugedag og -

Det kræver at vi gør det i to trin, først opretter vi en variabel kaldet dato, der er %date% uden ugedag:

set dato=%date:~3%

Dernæst fjerner man - fra dato, det gøres igen med set kommandoen:

set dato=%dato:-=%

Hvilket kan oversættes til: "set dato til at være dato hvor alle - er sat til at være ingenting".

Nu putter man blot de to sidste kommandoer ind før kommandoerne fra starten og erstatter sommer med %dato% så har man løst den første opgave, ganske simpelt.

Skulle der være enkelte der stadig bruger NT vil de sikkert vide (ellers vil de opdate det) at der ikke en %date% environment variabel i NT (den blev opfundet med 2000). Så de er nødt til at lave den, hvilket kan gøres med følgende simple kommando:

for /F "tokens=*" %%I in ('date /T') do @set date=%%I

Hvis du synes at det ser lidt indviklet ud, er det nok en god ide at køre kommandoen "help for". Som vanligt med for løkker skal %%I erstattes med %I i ovenstående hvis det skal køres direkte fra kommando linien.
Avatar billede bertelbrander Novice
23. oktober 2003 - 23:57 #3
>>tfa_dk, man kan let lave alle tre opgaver med standard dos kommandoer.
Avatar billede tfa_dk Nybegynder
24. oktober 2003 - 00:08 #4
Rolig nu læser stadig på set /h og date /h jeg har stadig ikke vendet mig til kommandoudvidelserne i dos. Måske er snart lige så godt som Rexx i OS2.
Avatar billede bertelbrander Novice
24. oktober 2003 - 19:20 #5
Det bør lige bemærkes at hvis man har mellemrun i filnavne og/eller stier er et nødvendigt at sætte "" omkring. Det kunne f.ex være tilfældet hvis man vælger at bruge %date% direkte.

De to linier fra starten bør derfor se ud som følger:

md "c:\kamera\sommer"
copy "g:\hh\*" "c:\kamera\sommer"

Hvis man er sikker på at det hele virker som ønsket, kan man slette filerne når de er kopieret (del "g:\hh\*") eller bruge move i stedet for copy.
Avatar billede bertelbrander Novice
24. oktober 2003 - 19:56 #6
For at løse opgave 2 og 3 vil det være praktisk at starte med at lave en løkke der kalder en funktion for hver fil i mappen. Det vil se nogenlunde såden ud:

for %%I in (*) do call :do_it "%%I"
goto :eof
:do_it
echo %~1

I korte træk er det der sker her, at man kalder funktione :do_it for hver fil i mappen, filnavnet er den første parameter (%1) i :do_it. DVS. at %%I i for loopen bliver til %1 i :do_it. Funktionen :do_it udskriver blot filnavnet.
Jeg kaldte funktionen med "%%1", så navnet vil have "" omkring i funktionen, disse kan man fjerne ved at skrive %~1 i stedet for %1. Dette gøres for at kunne håndtere filnavne med mellemrum. Hvis man kun ønsker at se på f.ex. jpg-filer ændres * i for-loopen til *.jpg

Hvis det stadig ikke står klart hvordan dette virker, kan det anbefales at læse om kommandoerne call og for. Eller studere lektion 1, hvor metoden bliver brugt en del.

I funktionen :do_it har vi brug for kende tiden på filen. Da du læste om call og/eller for så du måske at det kunne man gøre ved at kalde :do_it med "%%~tI" eller ved at bruge %~t1 i funktionen, vi vælger den sidste metode.

Vi kan nu udvide scriptet fra før så det udskriver både tiden og filnavn,
dette gøres ved at ændre sidste linie til:

echo %~t1 %~1

Det vil i nogle tilfælde se sådan ud:
01-10-03 00:58  www.cmd

Det ses heraf at %~t1 giver både dato og klokkeslet.

Vi kan nu sætte en variabel til at være tiden på filen:

set dato=%~t1

Man kan nu manipulere med %dato% som i mit forrige indlæg og bygge den kommando der skal til for at løse hhv opgave 2 og 3.
Avatar billede nph12 Nybegynder
25. oktober 2003 - 15:57 #7
Der er en del, så jeg starter lige med starten og prøver mig lige lidt frem.
Avatar billede nph12 Nybegynder
27. oktober 2003 - 00:07 #8
Nu har jeg fået prøvet "23/10-2003 23:55:27" og "24/10-2003 19:20:10". Prøver at kigge på "24/10-2003 19:56:19" i morgen.

Det er da %date% og ikke %dato%?
Avatar billede bertelbrander Novice
27. oktober 2003 - 00:19 #9
Ja og nej.
%date% er den variabel der aflæses for at få datoen, denne overføres til %dato% (med set dato=%date%) for at vi kan arbejde med den.
Avatar billede nph12 Nybegynder
27. oktober 2003 - 14:21 #10
Nu tror jeg er med!

@echo off
set dato=%~t1
for %%I in (*) do call :do_it "%%I"
goto :eof
:do_it
echo %~t1 %~1
Avatar billede bertelbrander Novice
27. oktober 2003 - 20:26 #11
Hvis du mener at du er med, kunne du så ikke:

1: Forklare hvad formålet med dit script er, herunder hvordan man bruger det og hvilken af de tre opgaver det løser.

2: På 5-7 linier beskive hvad de enkelte linier i scriptet gør.

3: Forklare hvad du har gjort for at eftervise at det gør det du ønsker (dvs. det du har beskrevet i punkt 1).
Avatar billede nph12 Nybegynder
27. oktober 2003 - 23:40 #12
Jeg mente bare, at jeg havde lavet "23/10-2003 23:55:27" og "24/10-2003 19:20:10". De ting som vi har indtil nu kan vel udbygges!
Avatar billede bertelbrander Novice
28. oktober 2003 - 00:32 #13
Jeg vil stadig gerne have dig til at forklare hvad du forestiller dig scriptet gør.

Du har en linie der ser sådan ud:

set dato=%~t1

Hvad gør den linie?

Har du prøvet at køre scriptet? Hvad sker der når du kører det?

I indlægene fra "23/10-2003 23:55:27" og "24/10-2003 19:20:10" beskriver jeg hvad der skal til for at løse opgave 1. Der er ikke brug for nogen for-løkke for at løse opgave 1 (medmindre du er begyndt at bruge NT).

For at løse opgave 2 og 3 skal der bruges en for-løkke, men lad os starte med at løse opgave 1.
Avatar billede nph12 Nybegynder
28. oktober 2003 - 16:56 #14
Denne linie gør følgende:
set dato=%~t1

%~t1 - udvider %1 til filens dato/klokkeslæt

Jeg har prøvet at køre scriptet. Scriptet viser nogle filer med dato og klokkeslæt.
Avatar billede nph12 Nybegynder
29. oktober 2003 - 15:37 #15
Skal vi starte med at løse opgave 1?
Avatar billede bertelbrander Novice
29. oktober 2003 - 19:26 #16
Du bestemmer selv hvilken opgave du vil starte med. Husk at fortælle os hvilken du har valgt når du poster spørgsmål/løsninger.

Hvad skete der med linien "set dato=%~t1" da du køret scriptet?
Avatar billede nph12 Nybegynder
29. oktober 2003 - 20:26 #17
Scriptet fra 24/10-2003 19:56:19 viser de filer som ligger i biblioteket (kun filnavn). Hvis man så tilføjer linien "set dato=%~t1" til scriptet, så udskriver scriptet også tid og dato ud for filnavnet.

Jeg starter med opgave 1 og læser lige dit indlægget fra 23/10-2003 23:55:27 igen.
Avatar billede nph12 Nybegynder
30. oktober 2003 - 17:37 #18
Opgave 1

md "e:\kamera\sommer"
copy "o:\DCIM\100MSDCF\*" "e:\kamera\sommer"

Når jeg kører scriptet, får jeg dette:
Der findes allerede en undermappe eller en fil med navnet e:\kamera\sommer.

Hvad er forskellen på at bruge copy og xcopy?
Avatar billede bertelbrander Novice
30. oktober 2003 - 20:12 #19
Du skal erstatte sommmer med en formateret version af %date% som beskrevet "23/10-2003 23:55:27" Da du jo ikke vil have alle billeder til at ligge i "e:\kamera\sommer", men f.ex i "e:\kamera\30102003" hvis det er billeder fra i dag.

Du kan få en glimrende forklaring på copy og xcopy ved at køre kommandoerne "help copy" og "help xcopy" eller kikke i Help->Start.
Avatar billede nph12 Nybegynder
02. november 2003 - 21:14 #20
Sådan?

set dato=%date:~3%
md "e:\kamera\%dato%"
copy "o:\DCIM\100MSDCF\*" "e:\kamera\%dato%"
Avatar billede bertelbrander Novice
02. november 2003 - 23:14 #21
Ja.
Hvordan ser det ud når du kører scriptet?
Hvad sker der hvis du kører det flere gange på en dag? Det var måske en ide at check om mappen eksisterer inden du opretter den? (prøv at kikke under if kommandoen og se på if exist ...)
Avatar billede nph12 Nybegynder
03. november 2003 - 17:53 #22
Jeg er gået lidt i stå. Jeg har kigger lidt på if kommandoen, men kan ikke rigtigt lige se, hvordan formen på scriptet skal være.
Avatar billede bertelbrander Novice
03. november 2003 - 20:37 #23
Du skal have udvidet "md "e:\..." med et check for om mappen eksisterer, så den starter med at checke om mappen eksisterer.

Kommandoen:
if exist "e:\kamera\%dato%" echo Mappen findes

Vil udskrive "Mappen findes" hvis mappen findes, kommandoen

if not exist "e:\kamera\%dato%" echo Mappen findes ikke

Vil udskrive "mappen findes ikke" hvis ikke mappen findes.

Nu skal du blot oprette mappen (md "e:\kamera\%dato%") hvis den ikke findes.

Kommandoen "if exist" skelner ikke mellem mapper og filer.
Avatar billede nph12 Nybegynder
04. november 2003 - 23:01 #24
Jeg har ikke lige fået oprettelse af mappen på plads. Jeg får stadigvæk:

Der findes allerede en undermappe eller en fil med navnet e:\kamera\04-11-2003.

set dato=%date:~3%
if exist "e:\kamera\%dato%" echo Mappen findes
if not exist "e:\kamera\%dato%" echo Mappen findes ikke
md "e:\kamera\%dato%"
copy "o:\DCIM\100MSDCF\*" "e:\kamera\%dato%"
Avatar billede bertelbrander Novice
04. november 2003 - 23:08 #25
Du skal lave en linie/kommando der laver:

Hvis ikke mappen e:\kamera\%dato% findes så lav mappen e:\kamera\%dato%

Det er blot en kombination af:

if not exist "e:\kamera\%dato%" echo Mappen findes ikke
md "e:\kamera\%dato%"

Hvor man ikke udskriver om mappen findes, men opretter den.
Avatar billede nph12 Nybegynder
05. november 2003 - 00:43 #26
Bare sådan?

set dato=%date:~3%
if exist "e:\kamera\%dato%" echo Mappen findes
if not exist "e:\kamera\%dato%" md "e:\kamera\%dato%" 
copy "o:\DCIM\100MSDCF\*" "e:\kamera\%dato%"
Avatar billede bertelbrander Novice
05. november 2003 - 19:49 #27
Ja, så simpelt er det.

Man kunne lave det så man brugte if (...) else (...), noget i stil med:

Hvis mappen ekisisterer
  Skriv at mappen fides
ellers
  opretmappen

Kør "help if" for at finde ud af hvordan.
Avatar billede nph12 Nybegynder
06. november 2003 - 16:50 #28
Sådan?

set dato=%date:~3%
if exist "e:\kamera\%dato%" ( echo Mappen findes
) else (
md "e:\kamera\%dato%" 
)
copy "o:\DCIM\100MSDCF\*" "e:\kamera\%dato%"
Avatar billede bertelbrander Novice
06. november 2003 - 20:49 #29
Ja.

Jeg ville nok skrive det som:

if exist "e:\kamera\%dato%" (
  echo Mappen findes
) else (
  md "e:\kamera\%dato%"
)

Da jeg synes det er lettere at læse, men det gør det samme.
Avatar billede nph12 Nybegynder
06. november 2003 - 22:29 #30
Hvad ska vi så lave mere til dette script? Kan man tilføje en log-fil til scriptet?
Avatar billede bertelbrander Novice
07. november 2003 - 00:36 #31
Man kan godt tilføje en log-fil.

Man kan f.ex tilføje >logfile.txt efter copy kommandoen, så skriver den til logfile.txt i stedet for til skærmen. Man kan kan også skrive direkte til logfilen vha, f.ex:

echo Opretter mappen %dato% >> logfile.txt

Hvis man bruger > overskrives filen, hvis man bruger >> tilføjes til filen.

Man kan også lave det så der kun skrives hvor mange filer der er kopieret ved at bruge kommandoen findstr.

Hvis jeg vil kopiere alle *.jpg filer til mappen c:\dump bruger jeg:

copy *.jpg c:\dump

copy vil så udskrive (hvis din windows snakker engelsk):
DSC00001.jpg
DSC00004.jpg
DSC00005.jpg
        4 file(s) copied.

Hvis jeg kun vil have fat i linien "4 file(s) copied." kan jeg bruge findstr som et filter:

copy *.jpg c:\dump |findstr copied

| er ALTGR+"tasten til venstre for BackSpace", og betyter pipe, dvs. overfør output fra kommandoen til venstre til kommandoen til højre.

Vil man så udskrive linien til logfile.txt bliver hele kommandoen:
copy *.jpg c:\dump |findstr copied >logfile.txt

Hvis man kun vil have fat i tallet må man kombinere med en for-løkke, men så er vi ovre i det mere avancerede (kun for dem der vil have 13).

Som du kan se er der mange muligheder, så prøv at lege lidt med det, og fortæl evt. hvad du kunne tænke dig at putte i log-filen.
Avatar billede nph12 Nybegynder
08. november 2003 - 17:11 #32
Jeg har prøvet at lege lidt med logfilen.

Jeg tænkte på, kan man bruge "copy *.jpg c:\dump" til at finde alle jpg-filer på flash-kort? Billederne ligger "o:\DCIM\100MSDCF\*", men det er jo ikke sikkert, at det gør det hvis jeg låner et kort fra et andet kamera.

Tilbage til log-filen. Jeg kunne godt tænke mig noget i denne stil, hvis man kan lave det:

1) Hvornår kopieringen har fundet sted
2) Hvor billederne er kopieret fra og hvorhen til
3) Evt. en status over hvor mange filer der er kopieret og evt. om der er nogle fejl.
Avatar billede bertelbrander Novice
08. november 2003 - 20:01 #33
A: Du laver en for-løkke der løber igennem alle mapper på et drev. f.ex. o:

B: For hver mappe fundet i punkt A kopieres alle .jpg-filer i mappen, en af gangen.


1: echo ... >log.fil

2: Her udskriver du mappens navn (fra punkt A) og destinationen. (echo ...>>log.fil)

3: Når du kopierer tæller du hvor mange der er kopieret, dette udskrives.

Hint til punkt A, kommandoen:

for /F %%I in ('dir /S /B /AD e:\') do @echo %%I

Lister alle mapper på drev e:
Avatar billede nph12 Nybegynder
09. november 2003 - 16:23 #34
Jeg forstår ikke rigtigt punkt A (eller ikke dit hint).
Avatar billede nph12 Nybegynder
10. november 2003 - 16:48 #35
Kan du ikke lige hjælpe mig lidt i gang med punkt A?
Avatar billede bertelbrander Novice
10. november 2003 - 20:32 #36
Start med at oversætte opgaven til pseudo sprog, kan evt gøres i flere step:

Step 1:
For hver mappe, kopier alle filer i mappen til destinationen.

Step 2:
For hver mappe kald funktionen ProcessFolder, angiv mappens navn som parameter
I funktionen ProcessFolder; kopier alle filer i mappen (parameteren) til destiantionen.

Step 3:
For Hver Undermappe, Kald :ProcessFolder MappeNavn
Done

:ProcessFolder
For hver fil i MappeNavn, Kopier filen til destinationen
Done

Nu skulle det være forholdsvist enkelt at oversætte pseudo-koden fra step 3 til batch kommandoer. De to For sætninger skal blive til en for-løkke og Done kan direkte oversættes til "goto :eof"

Når du har fået scriptet til at kopiere filerne, kan du tilføje skrivning til en logfil.
Når du skal i gang med det, starter du med at skrive i pseudo-sprog hvad du vil have tilføjet hvor.
Derefter oversætter du pseudo-sproget til batch-kommandoer.
Avatar billede nph12 Nybegynder
11. november 2003 - 16:12 #37
Jeg ved ikke engang, hvordan jeg skal starte på step 1.

Skal jeg bruge denne kommando?
for /F %I in ('dir /S /B /AD o:\') do @echo %I

Den viser mapperne på drevet, men hvordan får jeg så kopiere filerne over til mappen?
Avatar billede bertelbrander Novice
11. november 2003 - 20:32 #38
Step 1 til 3 er forskellige beskrivelser på det samme problem. Det var tænkt at step 1 skulle være det der lignede almindelig dansk mest og step 3 det der ligner batch-script mest.

Det der i step 3 beskrives som:

"For Hver Undermappe, Kald :ProcessFolder MappeNavn"

kan laves ved at bruge:

for /F %I in ('dir /S /B /AD o:\') do @echo %I

Og kalde :ProcessFolder med mappennavnet (%I) i stedet for at udskrive mappe navnet.

Linien:

For hver fil i MappeNavn, Kopier filen til destinationen

Skal ligeledes oversættes til en for-løkke.

Husk at når man bruger for-løkker i batch-scripts skal alle %I være %%I
Avatar billede nph12 Nybegynder
17. november 2003 - 16:06 #39
Jeg kan ikke rigtigt se det!

Med denne kommando får jeg mapperne på kortet!
for /F %I in ('dir /S /B /AD o:\') do @echo %I

Jeg er ikke helt med, hvad jeg skal med næste linie. Skal jeg lave en call kommando eller hvad?
Avatar billede bertelbrander Novice
17. november 2003 - 23:13 #40
Jeg må være meget dårlig til at forklare mig.

Det jeg ville var, at du skulle lave et script der gør følgende:

For Hver Undermappe, Kald :ProcessFolder MappeNavn
Done
:ProcessFolder
For hver fil i MappeNavn, Kopier filen til destinationen
Done


Kommandoen:
for /F %I in ('dir /S /B /AD o:\') do @echo %I

Udfører noget der kan beskrives som:

For Hver Undermappe, Udskriv MappeNavn

Du skal ændre kommandoen så den kalder en funktion der hedder :ProcessFolder i stedet for at udskrive mappenavnet.
At kalde en funktion der hedder :kurt gøres med kommandoen call :kurt
Du skal overføre mappenavnet til funktionen, det gøres ved at angive mappenavnet efter navnet på funktionen. I dette tilfælde er mappenavnet %I (/%%I)

Dernæst skal du lave funktionen :ProcessFolder
Du kan starte med at lade :ProcessFolder udskrive mappenavnet. I :ProcessFolder er mappenavnet %1

Når du har det til at virke, kan du lave en for-løkke der udfører "For hver fil i MappeNavn, Kopier filen til destinationen".
Avatar billede nph12 Nybegynder
18. november 2003 - 16:30 #41
Nu går det i den rigtige retning. Dog kopiere scriptet billederne to gange.

Først ligger billederne i denne sti "E:\kamera\18-11-2003", derefter ligger de også i "E:\kamera\18-11-2003\100MSDCF". Så laver scriptet den fejl, at den kopiere alle filer og mapper fra mappen kamera til roden af mit c-drev.Hvad gør jeg forkert?

set dato=%date:~3%
if exist "e:\kamera\%dato%" (
  echo Mappen findes
) else (
  md "e:\kamera\%dato%"
)

for /F %%I in ('dir /S /B /AD o:\') do call :ProcessFolder %%I
:ProcessFolder
xcopy/s %1 "e:\kamera\%dato%"
Avatar billede bertelbrander Novice
18. november 2003 - 20:20 #42
Du skal ikke bruge xcopy /S, /S betyder at den skal kopiere fra undermapper også, det ønsker vi netop ikke.

Når du har kørt for-løkken skal du have en "goto :eof", ellers vil den forsøge at køre :ProcessFolder igen.
Avatar billede nph12 Nybegynder
19. november 2003 - 17:27 #43
Sådan? Et lille problem, scriptet kopiere udover til mappen kamera også til roden af mit c-drev. Ellers kopiere det kun billeder nu som det skal!

set dato=%date:~3%
if exist "e:\kamera\%dato%" (
  echo Mappen findes
) else (
  md "e:\kamera\%dato%"
)

for /F %%I in ('dir /S /B /AD o:\') do call :ProcessFolder %%I
:ProcessFolder
xcopy %1 "e:\kamera\%dato%"
goto :eof
Avatar billede bertelbrander Novice
19. november 2003 - 19:45 #44
Du skal have flyttet linien med "goto :eof".

Når du har fået den sat ind det rigtige sted, kan du prøve at at forklare hvorfor den skal stå der.
Avatar billede nph12 Nybegynder
20. november 2003 - 16:02 #45
En lille fejl.

C:\>xcopy o:\DCIM\100MSDCF "e:\kamera\20-11-2003"
Angiver destinationen E:\kamera\20-11-2003 et
filnavn eller et mappenavn?
(F=Fil, M=Mappe)


set dato=%date:~3%
if exist "e:\kamera\%dato%" (
  echo Mappen findes
) else (
  md "e:\kamera\%dato%"
)

for /F %%I in ('dir /S /B /AD o:\') do call :ProcessFolder %%I
goto :eof
:ProcessFolder
xcopy %1 "e:\kamera\%dato%"
Avatar billede bertelbrander Novice
20. november 2003 - 20:05 #46
xcopy er et program for folk der bruger win9x/ME. Brug copy i stedet, eller find en kommandolinie parameter til xcopy der fortæller at destinationen er en mappe.
Avatar billede nph12 Nybegynder
20. november 2003 - 20:22 #47
Ja, sådan. Nu kører det!. Jeg har tilføjet en log-fil. Jeg ved ikke, hvad vi mere kan lave på dette script. Nogle gode idéer eller skal vi stoppe her med dette script?

set dato=%date:~3%
if exist "e:\kamera\%dato%" (
  echo Mappen findes
) else (
  md "e:\kamera\%dato%"
)

for /F %%I in ('dir /S /B /AD o:\') do call :ProcessFolder %%I
goto :eof
:ProcessFolder
xcopy/i/y %1 "e:\kamera\%dato%" >log.txt
Avatar billede bertelbrander Novice
20. november 2003 - 20:51 #48
Der behøves vist ikke mere til dette script, men du kunne overveje forskellen på: >log.txt og >>log.txt

Du kan også prøve at få xcopy til at fejle og se hvad der sker. Du kan f.ex prøve at kopiere filerne to gange, og måske lave filerne read-only (attrib +R *.*) efter første gang der er kørt.

Du kan evt. gå videre til opgave 2 eller 3
Avatar billede nph12 Nybegynder
22. november 2003 - 13:36 #49
Forskellen på: >log.txt og >>log.txt

>log.txt, opretter man en logfil
>>log.txt, tilføjer man noget til logfilen

Prøver lige at finde ud af, hvad vi skal gå videre med
Avatar billede nph12 Nybegynder
23. november 2003 - 19:06 #50
Kunne vi lave en logfil med status over, hvor mange filer der er blevet kopieret, dato for kopieringen, evt. fejl m.m.?

Det vil jeg kunne bruge til nogle af de andre script.
Avatar billede bertelbrander Novice
24. november 2003 - 19:54 #51
Vi kan godt lave en bedre logfil.

For at gøre det skal vi have lavet scriptet fra "20/11-2003 20:22:57" om, så det kopierer en fil af gangen i en for løkke.

Du skal have udskiftet linien:

xcopy/i/y %1 "e:\kamera\%dato%" >log.txt

Med noget kode der gør følgende:

for hver fil i mappen (%1) kald funktionen :CopyFile med filnavnet som parmeter.

I funktionen CopyFile kopieres filen.

(Du skal nok bruge en eller flere "goto :eof")

Du kan derefter tilføje en tæller til CopyFile funktionen, og checke om filen blev kopieret som ønsket.

Til slut kan du så udskrive diverse ting til log-filen.
Avatar billede nph12 Nybegynder
26. november 2003 - 17:43 #52
Jeg skal lige have lidt mere hjælp. 

set dato=%date:~3%
if exist "e:\kamera\%dato%" (
  echo Mappen findes
) else (
  md "e:\kamera\%dato%"
)

for /F %%I in ('dir /S /B /AD o:\') do call :ProcessFolder %%I
goto :eof
:ProcessFolder
Avatar billede bertelbrander Novice
28. november 2003 - 00:57 #53
Ok, vi gør det lige i nogle få step:

for /F "delims=;" %%I in ('dir /S /B /AD') do call :ProcessFolder "%%I"
goto :eof
:ProcessFolder
dir /B "%~1\*.jpg"

Bemærk at jeg har tilføjet "delims=;" til for-løkken og ændret den sidste %%I til "%%I". Dette er gjort for at forhindre den i at splitte stier med mellemrum i navnet op i flere dele. Dette virker fordi mappe og fil navne ikke kan indeholde ; i dos/windows.

I ProcessFolder er %1 mappenavnet med "" omkring, %~1 er mappe navnet uden "".
dir kommandoen i ovenstående vil liste alle .jpg-filer i mappen, men uden stien (dvs DSC00123.jpg og ikke o:\whatever\DSC00123.jpg). Vi vil gerne have puttet stien på, det kan vi gøre ved at putte det ind i en for-løkke:

for /F "delims=;" %%I in ('dir /S /B /AD') do call :ProcessFolder "%%I"
goto :eof
:ProcessFolder
for /F "delims=;" %%Z in ('dir /B "%~1\*.jpg"') do echo "%~1\%%Z"

Nu var det jo meningen at der skulle kaldes en funktion til at kopiere filerne i stedet for at udskrive navnet, det gøres simpelt ved at erstatte "echo" med "call :CopyFile" i sidste linie i koden ovenfor.

I funktionen CopyFile vil filenavnet inklusive stien være %1 så her skal du i første omgang lave en kommando der kopierer filen til "e:\kamera\%dato%".

Så kan du senere tilføje tæller og check til CopyFile-funktionen.

Husk: Du skal nok bruge en eller flere "goto :eof".
Avatar billede nph12 Nybegynder
28. november 2003 - 22:28 #54
Sådan, så skulle den være der! Hvordan gør jeg: "Så kan du senere tilføje tæller og check til CopyFile-funktionen."?

Den log-fil vi er ved at lave, den kan jeg vel bruge i andre scripts? Her tænker jeg på, om jeg bare uden videre kan kopiere koden ind i et andet script.

set dato=%date:~3%
if exist "e:\kamera\%dato%" (
  echo Mappen findes
) else (
  md "e:\kamera\%dato%"
)
for /F "delims=;" %%I in ('dir /S /B /AD o:\') do call :ProcessFolder "%%I"
goto :eof
:ProcessFolder
for /F "delims=;" %%Z in ('dir /B "%~1\*.jpg"') do call :CopyFile "%~1\%%Z"
goto :eof
:CopyFile
xcopy/i/y %1 "e:\kamera\%dato%"
Avatar billede bertelbrander Novice
29. november 2003 - 16:55 #55
At lave en tæller:

I starten af scriptet sætter du en tæller til at være 0 (set /A Counter=0)
For hver fil der kopieres i :CopyFile tælles tælleren en op (set /A Counter+=1).

Man kan lave checks på mange måder, nogle mere grundige end andre. Man kunne starte med at finde ud af om filen blev kopieret vha: "if exist ...."
Man kan også checke output fra kommandoen der kopierer, f.ex. checke det den skriver vha. find kommandoen, ca sådan:

xcopy/i/y %1 "e:\kamera\%dato%" |find "whatever"
if errorlevel 1 echo Fail.

whatever skal erstattes med noget xcopy skriver når den fik kopieret en fil, og "echo Fail" skal erstattes med skrivning af en fejlmeddelse til logfilen.

Der er i øvrigt ingen grund til at bruge xcopy til at kopierer en enkelt fil, copy kan godt finde ud af det.
Avatar billede nph12 Nybegynder
01. december 2003 - 20:35 #56
Jeg forstår ikke helt "whatever" (som jeg har sæt til %1).

Kan jeg bruge log-filen til en simpel xcopy kommando som f.eks. kunne kopiere ens dokumenter (som viser antal af filer som er kopieret, evt. fejl m.m.)? Eller kan vi lave et sådanne bagefter?

@echo off
set /A Counter=0
set dato=%date:~3%
if exist "e:\kamera\%dato%" (
  echo Mappen findes
) else (
  md "e:\kamera\%dato%"
)
for /F "delims=;" %%I in ('dir /S /B /AD o:\') do call :ProcessFolder "%%I"
goto :eof
:ProcessFolder
for /F "delims=;" %%Z in ('dir /B "%~1\*.jpg"') do call :CopyFile "%~1\%%Z"
goto :eof
:CopyFile
set /A Counter+=1
xcopy/i/y %1 "e:\kamera\%dato%" |find "%1"
if errorlevel 1 echo Fail.
Avatar billede bertelbrander Novice
01. december 2003 - 21:58 #57
Du kan godt putte output fra xcopy i log-filen direkte:

xcopy/i/y %1 "e:\kamera\%dato%" >logfil.txt

Jeg ville dog selv foretrække en log fil hvor der kun stod hvor mange filer der var kopieret og om der var nogen fejl.

Du kan evt. tilføje /F til xcopy, xå du kan se fuld path for destination og source.

Når jeg kopierer en fil med copy skriver den "1 file(s) copied." Hvis man sætter find til at lede efter dette og den ikke finder det, vil den sætte errorlevel. Så jeg kan bruge "1 file(s) copied." i stedet for "whatever" ovenfor. En dansk Win2000 vil sansynligvis skrive noget andet.
Avatar billede nph12 Nybegynder
01. december 2003 - 22:52 #58
Det virker godt med fuld path for destination og source. Kan vi ikke bygge videre på dette i stedet for opgave 2) og 3)?

xcopy/s/i/y/f "c:\" "d:\test\" >logfil.txt

Kan vi ikke afslutte kamera-scriptet nu og bare lave det sådan, at scriptet bare skriver "fejl", hvis der opstår fejl i kopieringen (ingen log-fil)?
Avatar billede bertelbrander Novice
01. december 2003 - 23:10 #59
Hvis du vil kopiere alle filer i mappen på en gang vha. xcopy kan du nøjes med en xcopy kommando, og der er ikke brug for nogen :copyFile funktion.

Med hensyn til at skrive "fejl" hvis noget gik galt: Man kan indsætte følgende efter xcopy kommandoen:

if errorlevel 1 echo Something went wrong
Avatar billede nph12 Nybegynder
02. december 2003 - 15:25 #60
Bare sådan? Dog skriver scriptet "0 fil(er) kopieret" ved DCIM mappe, hvor der findes undermappen 100MSDCF (som indeholder alle billederne).

O:\DCIM
O:\DCIM\100MSDCF

set dato=%date:~3%
if exist "e:\kamera\%dato%" (
  echo Mappen findes
) else (
  md "e:\kamera\%dato%"
)
for /F "delims=;" %%I in ('dir /S /B /AD o:\') do call :ProcessFolder "%%I"
goto :eof
:ProcessFolder
xcopy/i/y %1 "e:\kamera\%dato%"
if errorlevel 1 echo Fejl i kopieringen
Avatar billede bertelbrander Novice
02. december 2003 - 23:32 #61
I :ProcessFolder kan du lave et check for om der findes .jpg billeder i mappen ved at bruge "if exist ....". Du kan blot springe mappen over (goto :eof) hvis der ikke findes nogen .jpg billeder.
Avatar billede nph12 Nybegynder
03. december 2003 - 00:39 #62
Sådan? Det ser ud til at virke!

@echo off
set dato=%date:~3%
if exist "e:\kamera\%dato%" (
  echo Mappen findes
) else (
  md "e:\kamera\%dato%"
)
for /F "delims=;" %%I in ('dir /S /B /AD o:\') do call :ProcessFolder "%%I"
goto :eof
:ProcessFolder
if exist %1\*.jpg (
xcopy/i/y %1 "e:\kamera\%dato%"
if errorlevel 1 echo Fejl i kopieringen
)  else (
goto :eof
)
Avatar billede bertelbrander Novice
03. december 2003 - 00:54 #63
Nydeligt!
Avatar billede nph12 Nybegynder
03. december 2003 - 16:57 #64
Okay, så er kamera-scriptet på plads:-) Kan vi så fortsætte med log-filen? Jeg skal næsten oprette et nyt spørgsmålet til dette.
Avatar billede bertelbrander Novice
03. december 2003 - 23:38 #65
Jo, vi kan godt fortsætte med log-filen, og ja, det ville nok være på plads med et nyt spørgsmål.

Hvis ikke du vil arbejde videre med opgave 2 og 3 vil jeg forsøge at lave en løsning til disse, så vi kan få dette spørgsmål afsluttet på en ordentlig måde.
Avatar billede nph12 Nybegynder
04. december 2003 - 17:14 #66
Fint. Jeg synes, at vi skal fortsætte med log-filen nu. Jeg oprettet et nyt spørgsmål til dette. Hvad skal jeg kalde spørgmålet?

Jeg har ikke tænkt mig at arbejde videre med opgave 2 og 3, men hvis du har lyst må du gerne.
Avatar billede bertelbrander Novice
04. december 2003 - 23:37 #67
Du kunne kalde spørgsmålet "Bat programmering del 3".

Post scriptet fra "03/12-2003 00:39:27" og fortæl at du gerne vil have tilføjet en log-fil.

Lav et svar og accepter det, så vi kan få dette spørgsmål lukket.
Avatar billede nph12 Nybegynder
05. december 2003 - 19:19 #68
Okay, så kalder jeg spørgsmålet "Bat programmering del 3".

Det har jo ikke så meget med scriptet fra "03/12-2003 00:39:27" at gøre. Det er mere noget med xcopy, og hvordan man tilføjer en log-fil (01/12-2003 22:52:41).
Avatar billede nph12 Nybegynder
05. december 2003 - 19:34 #69
Lukker her og henviser til det nye spørgsmål:
http://www.eksperten.dk/spm/436453
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