Avatar billede nph12 Nybegynder
08. september 2003 - 18:16 Der er 72 kommentarer og
1 løsning

Bat programmering del 1

Hej
Vi starter med at lave en bat-fil fra bunden.

Opgave: En bat fil der beregner hvor mange bytes der er i en mappe, uden at bruge dir.

(Dette er et spørgsmål som alle kan deltage i og lære noget om bat programmering)

Tidligere spørgsmål:
http://www.eksperten.dk/spm/394907
Avatar billede Slettet bruger
08. september 2003 - 19:41 #1
Underviser du os?
Avatar billede bertelbrander Novice
08. september 2003 - 19:56 #2
Jeg tror at det er meningen at der er nogle der kommer med tips til hvordan man kan løse opgaven, og at man derefter selv prøver at lave et script, man kan så poste et indlæg her hvis man har problemer, eller poste en løsning. Meningen er ikke så meget at få løst problemet, som at finde ud af hvordan man løser problemet.

For at løse denne opgave skal man vide at man kan regne i bat scripts vha. kommandoen "set /A" og at man kan liste alle filer i en mappe vha. kommandoen "for"
Hvis man skriver "help set" og "help for" i en kommando prompt får man at vide hvordan man bruger disse kommandoer.
Specielt bør man kikke på det der står til sidst om kommandoen for angående %~zI
Avatar billede Slettet bruger
08. september 2003 - 20:01 #3
Ah, ja så blev jeg så klog :-) Jeg ventede egentlig mere da der stod "Vi starter med at lave en bat-fil fra bunden".
Avatar billede bertelbrander Novice
08. september 2003 - 20:24 #4
Hvis du vil starte på et endnu lavere niveau, lære om parametre, grundlæggende bat-fil teknikker, osv, så kan det anbefales at slå op under batch i Start->Help.
Avatar billede nph12 Nybegynder
09. september 2003 - 00:07 #5
Det gik vist lidt hurtig med at oprette spørgsmålet, men håber alle ved hvad det går ud på nu.

Jeg kigger lige på kommandoerne og prøver at finde ud af, hvordan de virker.
Avatar billede bertelbrander Novice
09. september 2003 - 02:09 #6
Det skal vist lige nævnes at man nok ikke slipper for at kikke på call "kommandoen", og muligheden for at kalde en "funktion" med "call :func", der sansynligvis skal bruges sammen med for.
Og så skal man også lige vide at man returnerer fra en "funktion" ved at skrive goto :eof, men det finder man ud af hvis man skriver "help call".
Avatar billede nph12 Nybegynder
09. september 2003 - 22:27 #7
Jeg har lige kigget lidt på de forskellige kommandoer. Jeg synes det er lidt svært, at læse om de forskellige kommandoer i cmd. Er det de samme oplysninger der ligger i Start->Help? Eller har microsoft en oversigt over de forskellige kommandoer?

Hvordan jeg på bat-filen?
Avatar billede bertelbrander Novice
09. september 2003 - 22:49 #8
Den information du får ved at skrive "help for" er stort set den samme som du får under Start->Help. Der er dog lidt flere informatiner under Start->Help.

Hvad mener du med: "Hvordan jeg på bat-filen?" ?
Avatar billede bertelbrander Novice
09. september 2003 - 23:07 #9
Når jeg laver bat-scripts starter jeg i reglen med at lave noget meget simpelt, det kunne i dette tilfælde være:

for %%I in (*) do echo %%I

Hvilken lister alle filer i nuværende direktorie.

Hvis man skriver:

for %%I in (*) do echo %%I %%~zI

får man, udover filnavnet på alle filer, deres størrelse.

Næste skridt er at kalde en "funktion" fra for løkken:

for %%I in (*) do call :add %%I %%~zI
goto :eof

:add
echo %1 %2
goto :eof

Det der sker her er at funktionen (add) bliver kaldt med parametrene %%I (dvs filnavnet) og %%~zI (dvs størrelsen på filen) for hver fil i mappen. Disse parametre bliver i funktionen til %1 og %2. Den første "goto :eof" afslutter bat-filen, den anden returnerer fra funktionen.

Nu mangler man blot at lægge alle fil-størrelserne sammen.
Avatar billede nph12 Nybegynder
10. september 2003 - 17:43 #10
Jeg mente selvfølgelig: "Hvordan starter jeg på bat-filen?" Jeg prøver lige at lege lidt med de forskellige kommandoer.

Okay, så bruger jeg Start->Help, så har jeg også mulighed for at printe noget af det ud.
Avatar billede nph12 Nybegynder
11. september 2003 - 19:32 #11
Jeg tror at jeg forstår det, men alligevel ikke....

Kan du ikke forklare, det engang til helt fra starten? Forklar lige hvad de forskellige ting gør i kommandolinien. Jeg har kigget i Start->Help, men synes lige, at jeg kører lidt rundt i det.
Avatar billede nph12 Nybegynder
13. september 2003 - 11:05 #12
Jeg forstår det ikke helt, så kan du ikke starte med at forklare den her først? Hvad gør den og hvorfor gør den det?

for %%I in (*) do echo %%I
Avatar billede bertelbrander Novice
13. september 2003 - 13:12 #13
Syntaxen for en for kommando er:

FOR parametre variabel IN (set) DO command

FOR, IN og DO skal være der i alle for løkker og kan ikke ændres.
Alle for loops specificerer en variabel, et set og en kommando.
Nogle for loops har paramtre, den du nævner har ingen.

Det for kommandoen gør er at køre "command" for hver element i "set" på en sådan måde at "variabel" bliver sat til at være det næste element i "set".

I "for %%I in (*) do echo %%I" er variablen %%I, set er *, kommando er "echo %%I", og et element i set er en fil.

Så man kan forklare kommandoen som:
For hver fil udfør kommandoen "echo %%I" idet %%I erstattes med filnavnet.

En lille detalje:
Variablen er egentlig %I og ikke %%I. Grunden til at vi skriver %%I er at %% bliver erstatet med % når kommandoen parses, kommandoen for ser parametren som %I.
Hvis man vil køre kommandoen fra kommandolinien skal man skrive:
for %I in (*) do echo %I
Avatar billede nph12 Nybegynder
15. september 2003 - 14:52 #14
Nu er jeg vist med igen :-) Så skal jeg tilføje til scriptet, at det skal vise summen af alle filer. Hvad skal jeg bruge af kommandoer til det?

for %%I in (*) do call :add %%I %%~zI
goto :eof

:add
echo %1 %2
goto :eof
Avatar billede bertelbrander Novice
15. september 2003 - 20:36 #15
Følgende lille script viser hvordan man regner i et batch script:

set /A xxx=0
set /A xxx+=7
set /A xxx+=9
echo %xxx%

Det bør bemærkes at "xxx+=9" er det samme som xxx=%xxx% + 9
Avatar billede nph12 Nybegynder
17. september 2003 - 16:41 #16
Jeg er ikke helt med på, hvordan man ligger disse tal sammen.

Jeg forstår ikke, hvordan det hænger sammen.

set /A xxx=0
set /A xxx+=7
set /A xxx+=9

Jeg har kigget i cmd´en under set.

Resutatet vises vel her med denne kommando?
echo %xxx%
Avatar billede bertelbrander Novice
17. september 2003 - 17:20 #17
set /A biver brugt til at regne med, hvis man f.ex skriver dette i en kommando prompt:

set /A 12 + 12

Skriver den (meget lidt overraskende) 24

Hvis man vil have variablen sum til at være resultatet af 12 + 12 skriver man:

set /A sum=12 + 12

Hvis man vil have lagt 33 til sum skriver man:

set /A sum=%sum% + 33

eller:

set /A sum+=33

og man udskriver sum med:

echo %sum%

I koden fra 15/9-2003 14:52:51 skal vi have lagt alle størrelserne sammen og udskrevet resultatet til sidst.

Vi starter med at sætte en variabel til 0

set /A sum=0

I :add er %2 størrelsen på en fil, så vi skal have den lagt til sum:

sum+=%2

Til slut skal resultatet udskrives:
echo %sum%
Avatar billede nph12 Nybegynder
18. september 2003 - 22:04 #18
Jeg har siddet og lavet lidt med bat-scriptet. Jeg kan se, at den ligger tallene sammen. Jeg har lavet en "pause" kommando sidste i scriptet, så jeg kan se, hvad det gør. Den skal vel vise resultatet inden cmd prompten lukker ned. Hvordan gør jeg det?

set/a sum=0
for %%I in (*) do call :add %%I %%~zI
goto :eof

:add
echo %1 %2
set/a sum+=%2
echo %sum%
pause
Avatar billede bertelbrander Novice
18. september 2003 - 23:12 #19
I tidernes morgen (dvs før Windows NT) brugte man call kommandoen til at kalde et batch script fra et andet.
Senere fandt man på at det kunne være smart at to eller flere batch scripts kunne være i samme fil, og ikke som førhen i forskellige filer. Derfor opfandt man "call :label" syntaxen. Samtidig opfandt man "goto :eof" syntaxen til at "returnere" fra et batch-script før man når enden af filen, eof betyder netop End Of File.

Du kan derfor betragte scriptet ovenfor som to seperate scripts, f.ex sum.bat:

set/a sum=0
for %%I in (*) do call add.bat %%I %%~zI

og add.bat:

echo %1 %2
set/a sum+=%2
echo %sum%
pause

Det der sker i sum.bat er at den sætter sum til 0 og kalder add.bat for alle filer i nuværende direktorie.

Add.bat udskriver de to første parametre (%1 og %2) og lægger %2 til sum, samt udskriver sum og kalder pause.

Det vi gerne vil er at udskrive summen når vi har lagt alle størrelserne sammen, da add.bat bliver kaldt for hver fil, bør det være klart at vi skal udskrive summen i sum.bat der kun bliver udført en gang.

Så vi skal have flyttet:

echo %sum%
pause

Til sum.bat

Da vi ønsker at have det hele i én fil, kommer resultatet til at se sådan ud:

set/a sum=0
for %%I in (*) do call :add %%I %%~zI
echo %sum%
pause
goto :eof

:add
echo %1 %2
set/a sum+=%2

Det bemærkes at "goto :eof" er afslutningen af den del vi før kaldte sum.bat.

Der lige et par småting det kunne være rart at få rettet/tilføjet til scriptet inden vi går videre:

1: Det er vel ikke nødvendigt at udskrive alle filenavne og deres størrelse.
2: Det ville være rart at få talt hvor mange filer der er i mappen.
3: Det kunne være rart med en lidt mere forklarende text som output f.ex: 
Der er fundet xxx bytes i yyy filer.
Avatar billede nph12 Nybegynder
20. september 2003 - 14:27 #20
Jeg tror, at jeg skal have lidt mere ledetråd til de tre tilføjelser. Kan vi ikke tage et punkt af gangen?
Avatar billede bertelbrander Novice
20. september 2003 - 15:36 #21
1: Slet den linie der udskriver filnavn og størrelse for hver fil.
2: Sæt en variabel, f.ex antalfiler til 0, tæl den en op (set /A antalfiler+=1) for hver fil, udskriv den.
3: Lav linien der udskriver om så den skriver en mere forklarende tekst (inklusive antallet af filer).
Avatar billede nph12 Nybegynder
22. september 2003 - 15:26 #22
Jeg har fået scriptet til at tælle antal af filer, men cmd´en lukker ned, når den er færdig med at tælle.

set/a sum=0
set/a antalfiler=0
for %%I in (*) do call :add %%I %%~zI

:add
set/a sum+=%2
set/a antalfiler+=1

:vis
cls
echo Antalfiler %antalfiler%
echo Disse filer fylder %sum%
Avatar billede bertelbrander Novice
22. september 2003 - 17:52 #23
Når man tester batch-scripts er det altid en god ide at åbne en kommando-prompt (Start->kør/run) og så køre kommandoen derfra.

Hvis du vil have et batch-script til at stoppe (f.ex før det afslutter kan man indsætte en pause kommando).

Hvis du kikker på output fra scriptet kan du se at det kører :vis funktionen for alle filer, hvor vi kun ønsker at det skal gøre det en gang til slut.
Det gør den fordi den kalder funktionen :add for hver fil og den returnerer først fra denne funktion når den når bunden af filen dvs. efter :vis

Man vil også kunne se at den kører funktionen :add lige efter den har udført for kommandoen fordi denne kommer lige efter for kommandoen.

Du er måske nød til at fjerne cls kommandoen for at kunne se hvad der sker. Det kan også hjælpe at øge antallet af linier man kan se i vinduet (Alt+Mellemrum),  så du kan scrolle tilbage og se hvad der sker.

Så vi (dvs du) skal have den til at returnere fra :add funktionen, inden den når :vis, det gør man med goto :eof

Du skal også have den til at udføre funktionen :vis efter for kommandoen, det gør du med goto :vis Den vil så afsluttte herefter, da du ikke har kaldt :vis men kun hoppet til den.
Avatar billede bertelbrander Novice
22. september 2003 - 20:05 #24
Det kan måske være en lille hjælp at finde ud af hvad forskellen på disse to scripts er.

Script1:

@echo off
call :next
echo Hello Peter
goto :eof
:next
Echo Hello Niels

Script2:

@echo off
goto :next
echo Hello Peter
goto :eof
:next
Echo Hello Niels

Hvad skriver de to og hvorfor, prøv om du kan regne det ud før du kører dem.
Avatar billede nph12 Nybegynder
24. september 2003 - 00:06 #25
Nu skulle den være der!

@echo off
set/a sum=0
set/a antalfiler=0
for %%I in (*) do call :add %%I %%~zI

:vis
echo Antalfiler %antalfiler%
echo Disse filer fylder %sum%
goto :eof

:add
set/a sum+=%2
set/a antalfiler+=1
Avatar billede bertelbrander Novice
24. september 2003 - 00:31 #26
Ja, det ser næsten rigtigt ud.

Der er lige tre detaljer:

1: Hvad sker der hvis der er filer der har mellemrum i navnet? Hvordan får man det til at virke med disse? (hint: "").

2: Funktionen :add bruger ikke filnavnet, så der er vel ingen grund til at overføre det (prøv at løse punkt 1 før du løser dette).

3: Labelen :vis bliver ikke brugt og kan derfor fjernes.
Avatar billede nph12 Nybegynder
24. september 2003 - 17:34 #27
Jeg har fjernet :vis fra scriptet.

Jeg ved, at jeg skal sætte nogle "" et sted i denne linje, men ved ikke hvor.

for %%I in (*) do call :add %%I %%~zI

"Det der sker her er at funktionen (add) bliver kaldt med parametrene %%I (dvs filnavnet) og %%~zI (dvs størrelsen på filen) for hver fil i mappen"

Skal jeg bare slette %%I efter :add ?

Jeg har prøvet mig lidt frem, men synes ikke rigtigt, at få det til at virke.
Avatar billede bertelbrander Novice
24. september 2003 - 20:36 #28
Når man kalder et bat-script eller en label vha call :label bliver den første parameter man angiver til %1, den næste til %2 osv, man adskiller parametre med mellemrum.

Når du kalder lablen :add med f.ex test.dat og 12 bliver %1 i funktionen :add til test.dat og %2 til 12.

I for loopen bliver %%I erstattet med filnavnet og %%~zI med størrelsen på filen. Det er fint sålænge filen hedder f.ex test.dat, men hvis filen hedder:
fil navn med sjove mellemrum . ext
har vi et problem, for så bliver %1 i :add til fil og %2 bliver til navn (og %3 til med osv), og det går jo ikke.

For at undgå dette sætter vi "" omkring %%I for så bliver det til en parameter. I :add vil man så se %1 som "fil navn med sjove mellemrun . ext" (inklusive "")

Hvis man vil have fjernet disse "" fra %1 skriver man %~1

AD 1: Du skal sætte "" omkring %%I. Prøv at udskrive filnavnet med og uden %~1

AD 2: Hvis du fjerner %%I (eller "%%I") i kaldet til :add bliver størrelsen af filen %1 i :add, så :add skal ændres så den lægger %1 til størrelsen.
Avatar billede nph12 Nybegynder
24. september 2003 - 22:45 #29
Når jeg skriver
for "%%I" in (*) do call :add %%~zI

Får jeg følgende meddelelse:

"%I" var ikke ventet på dette tidspunkt.

Hvad gør jeg forkert?

Ellers er scriptet rettet til dette:

@echo off
set/a sum=0
set/a antalfiler=0
for %%I in (*) do call :add %%~zI

echo Antalfiler %antalfiler%
echo Disse filer fylder %sum%
goto :eof

:add
set/a sum+=%1
set/a antalfiler+=1
Avatar billede bertelbrander Novice
24. september 2003 - 22:55 #30
De to " skal tilføjes i kaldet til :add

for %%I in (*) do call :add "%%I" %%~zI
Avatar billede nph12 Nybegynder
24. september 2003 - 23:42 #31
Nu kan jeg se det!

Det virker nu!

@echo off
set/a sum=0
set/a antalfiler=0
for %%I in (*) do call :add "%%I" %%~zI

echo Antalfiler %antalfiler%
echo Disse filer fylder %sum%
goto :eof

:add
set/a sum+=%2
set/a antalfiler+=1
Avatar billede bertelbrander Novice
24. september 2003 - 23:54 #32
Fint!

Næste trin kunne være at udvide scriptet til at finde antal filer og deres samlede størrelse i en bestemt mappe f.ex. c:\winnt, mappen skulle så angives som parameter til scriptet.
Avatar billede nph12 Nybegynder
25. september 2003 - 19:45 #33
Ja, men hvordan gør jeg det?
Avatar billede bertelbrander Novice
25. september 2003 - 20:23 #34
Du skal ændre det set som for kommandoen looper over. Indtil nu har vi brugt * som set, hvis vi ændrer * til *.foo vil scriptet tælle størrelsen på alle .foo filer, og hvis vi ændrer set til c:\win\* vil den finde størrelsen for alle filer i c:\win

Den første parameter man angiver til et script hedder %1 (ligesom i funktioner).

Det vil måske være en ide at checke om brugeren har husket at angive en sti, det gør man med kommandoen if, f.ex

if {%1}=={} (
  echo Du skal angive en parameter
  goto :eof
)

Hvis brugeren ikke angiver nogen sti kunne man bruge nuværende direktorie som default, i stedet for at returnere.
Avatar billede nph12 Nybegynder
26. september 2003 - 17:15 #35
Bare sådan her?

@echo off
set/a sum=0
set/a antalfiler=0
for %%I in (%1) do call :add "%%I" %%~zI

if {%1}=={} (
  echo Du skal angive en parameter
  goto :eof
)

echo Antalfiler %antalfiler%
echo Disse filer fylder %sum%
goto :eof

:add
set/a sum+=%2
set/a antalfiler+=1
Avatar billede bertelbrander Novice
26. september 2003 - 20:42 #36
Har du prøvet, virker det?

Det vil virke hvis man angiver f.ex. c:\winnt\* som parameter, men ikke hvis man kun angiver c:\winnt

Jeg vil foretrække at man kun skal angive c:\winnt og at scriptet selv fylder \* på.

Testen på om %1 er tom skal ske inden man bruger den. Hvis den er tom bør man bruge * som set.

Jeg vil stadig mene at du skal fjerne filnavnet fra kaldet til :add da vi ikke bruger det. Husk at rette :add.
Avatar billede nph12 Nybegynder
26. september 2003 - 22:27 #37
Jo, det virker når jeg bruger f.eks. c:\winnt\*

1) Hvordan får jeg scriptet selv at fylde \* på?

2) "Testen på om %1 er tom skal ske inden man bruger den. Hvis den er tom bør man bruge * som set." - det forstår jeg ikke lige!

3) Hvordan fjerner jeg kaldet til filnavnet og rette i :add?
Avatar billede bertelbrander Novice
27. september 2003 - 00:11 #38
1: Bruger %1\* som set i for kommandoen.

2: F.ex:
if {%1}=={} (
Køre for loopen med * som set
) else (
Køre for loopen med %1\*
)

3: Det har du gjort en gang, se på dit indlæg fra 24/09-2003 22:45:03
Avatar billede nph12 Nybegynder
27. september 2003 - 12:03 #39
Så er 1) og 3) lavet. Jeg kan ikke rigtigt for 2) til at køre.

@echo off
set/a sum=0
set/a antalfiler=0
if {%1}=={} (
  echo Du skal angive en parameter
  goto :eof
)

for %%I in (%1\*) do call :add %%~zI

echo Antalfiler %antalfiler%
echo Disse filer fylder %sum%
goto :eof

:add
set/a sum+=%1
set/a antalfiler+=1
Avatar billede bertelbrander Novice
27. september 2003 - 12:45 #40
Ad 2: Du skal have to for løkker, en der kører når if {%1}=={} med * som set
og en med %1\* som set. Disse skal placeres i if () else () som vist i kommentaren fra 27/09-2003 00:11:34 i stedet for "Køre for loopen ..."
Avatar billede bertelbrander Novice
27. september 2003 - 13:05 #41
Hvis du har mod på flere opgaver kan du lave det så den skriver:
Disse filer fylder 1.234.567
i stedet for
Disse filer fylder 1234567
Avatar billede nph12 Nybegynder
27. september 2003 - 18:43 #42
Jeg har mod på flere opgaver!

Jeg har forstået, at jeg skal lave to løkker. Jeg ved bare ikke rigtigt, hvordan jeg skal gøre det. Jeg har prøvet.
Avatar billede bertelbrander Novice
28. september 2003 - 00:07 #43
At ændre uskriften kan gøres vha. set /A
Du kan også bruge set direkte, %sum:~-3% giver således de sidste 3 cifre i sum, %sum:~0,-3% giver alt i sum pånær de sidste tre cifre.
Start med at lave algoritmen på et stykke papir, og lav så koden.

Prøv at vise hvad du har lavet med de to for løkker. Jeg synes ikke jeg kan komme med flere hints, uden at komme med en løsning.
Avatar billede nph12 Nybegynder
29. september 2003 - 15:09 #44
Jeg har lavet scriptet med de to løkker. Jeg tror desværre, at jeg også skal have lidt mere hjælp til det med udskriften.

@echo off
set/a sum=0
set/a antalfiler=0
if {%1}=={} (
  echo Du skal angive en parameter
  goto :eof
)

if {%1}=={} (
for %%I in (%1\*) do call :add %%~zI
) else (
for %%I in (*) do call :add %%~zI
)

echo Antalfiler %antalfiler%
echo Disse filer fylder %sum%
goto :eof

:add
set/a sum+=%1
set/a antalfiler+=1
Avatar billede bertelbrander Novice
29. september 2003 - 20:50 #45
Når man skal lave et program starter man (specielt hvis man er ny og/eller opgaven er stor) med at lave en symbolsk repræsentation af programmet. Ved større opgaver vil man ofte bruge et eller andet grafisk værktøj, til vore (relativt) simple scripts kan vi lave en tekstuel beskrivelse af programmet. Hvis man skal forstå hvad et program gør kan man starte med at lave en symbolsk repræsentation af programmet (det kaldes reverse engeneering).

Man kan f.ex "oversætte":

if {%1}=={} (
  echo Du skal angive en parameter
  goto :eof
)

Til:

Hvis DenFørsteParameter er tom så:
  Udskriv "Du skal angive en parameter"
  Afslut
END.

Bemærk indryk bruges til at beskrive at dette er en blok. Hvordan man laver "sproget" er ikke så vigtigt, det skal blot være en mellemting mellem almindelig dansk og det sprog man vil programere i.

Man kan oversætte følgende:
for %%I in (*) do call :add %%~zI
Til:
For hver fil (*) kald :add med størrelsen på filen (%%~zI) som parameter.

Hvis du oversætter hele scriptet på den måde vil jeg tro at du kan se fejlene. Hvis ikke så fjern første linie (@echo off) og kør så scriptet i en mappe med kun nogle få filer og se hvad der sker. Du kan evt. køre scriptet sådan her:

tt.bat *.ght >tt.txt

Hvor tt.bat er navnet på bat-filen og tt.txt er en fil hvori output fra kommandoen bliver puttet, så kan du åbne tt.txt i f.ex. notepad og se det der.


Med hensyn til udskriften, kan vi lave en symbolsk beskrivelse der ser sådan ud:

Tal=ABCDEFGHIJ (DVS tal er det indput der skal laves om til A.BCD.EFG.HIJ)
One=TreSidsteCifreI(Tal)
FjernTreSidsteCifreI(Tal)
Kilo=TreSidsteCifreI(Tal)
FjernTreSidsteCifreI(Tal)
Mega=TreSidsteCifreI(Tal)
FjernTreSidsteCifreI(Tal)
Giga=Tal
Udskriv: Giga.Mega.Kilo.One

Man kan så oversætte:

Mega=TreSidsteCifreI(Tal)

til:

set Mega=%Tal:~-3%

På samme måde kan man oversætte:

FjernTreSidsteCifreI(Tal)

Til:

set Tal=%Tal:~-0,-3%

Og til slut kan man oversætte:

Udskriv: Giga.Mega.Kilo.One

Til

echo %Giga%.%Mega%.%Kilo%.%One%

Der er dog en lille detalje. Det er ikke altid at Tal indeholder 10 cifre, så vi er nødt til at tage højde for dette, pseudo koden vil så komme til at se sådan ud:

Tal=ABCDEFGHIJ (DVS tal er det indput der skal laves om til A.BCD.EFG.HIJ)
One=TreSidsteCifreI(Tal)
FjernTreSidsteCifreI(Tal)
Hvis Tal er tom så:
  Udskriv One
  Afslut
End
Kilo=TreSidsteCifreI(Tal)
FjernTreSidsteCifreI(Tal)
Hvis Tal er tom så:
  Udskriv Kilo.One
  Afslut
End
Mega=TreSidsteCifreI(Tal)
FjernTreSidsteCifreI(Tal)
Hvis Tal er tom så:
  Udskriv Mega.Kilo.One
  Afslut
End
Giga=Tal
Udskriv: Giga.Mega.Kilo.One

Jeg vil foreslå at du laver et selvstændig script, som du giver det tal der skal udskrives til som parameter. Du kan så putte det ind i det andet script når du har fået det til at virke.
Avatar billede nph12 Nybegynder
01. oktober 2003 - 20:12 #46
Det bliver nok først i weekenden, jeg får kigget på det.
Avatar billede nph12 Nybegynder
05. oktober 2003 - 23:49 #47
Kan jeg ikke gemme dette til efterårsferie (om en uges tid)?. Har printet det sidste ud du skrev, og kigger lige lidt på det.

Kan vi ikke lave programmet sådan, at man kan klikke på bat-filen og vælge en sti? Hvordan gør jeg det?
Avatar billede bertelbrander Novice
06. oktober 2003 - 00:05 #48
Du bestemmer selv hvornår du vil gå videre.

Man kan bede brugeren indtaste en sti vha. set /P, f.ex:
SET /P sti="Angiv sti:"

Det er ikke ret let at lave det så brugeren kan vælge en sti.
Avatar billede nph12 Nybegynder
10. oktober 2003 - 10:42 #49
Jeg har kigget lidt på det sidste og synes, det er lidt svært. Enten skal jeg have lidt mere hjælp ellers synes jeg bare, at vi skal droppe det sidste.

Vi kunne evt. starte på backup/restore scriptet. Scriptet skal kopiere filer/mapper eller evt. et helt drev over til et andet sted. Hvis det er muligt kunne vi tilføje en logfil, og en progressbar der viser hvor lang processen er kommet.

Jeg opretter selvfølgelig et nyt spørgsmål, hvis du har mod til at vi laver backup/restore scriptet nu.
Avatar billede bertelbrander Novice
11. oktober 2003 - 00:41 #50
Jeg går ud fra at du med "det sidste" mener at lave 12345678 om til 12.345.678.
Jeg har lavet en start på sådan et script, men det håndterer kun tal op til 999999, så du kan prøve at udvide det til at håndtere tal op til 9999999999.

@echo off
if [%1]==[] echo Du skal angive et tal & goto :eof
set tal=%1
set one=%tal:~-3%
set tal=%tal:~0,-3%
if [%tal%]==[] echo %One% & goto :eof

set kilo=%tal%
echo %kilo%.%one%

Jeg vil gerne hjælpe med at lave et backup/restore script, men jeg tror at det vil være for svært for dig endnu. Jeg tror at der er for mange helt grundlæggende ting du skal have lært før vi kan starte på det. Mens du får ovenstående til at spille kan jeg prøve at finde nogle overkommelige øvelser.

Hvor komplext et backup/restore script kan være, kan du se her:

http://www.eksperten.dk/spm/389684

Jeg har ikke lavet scriptet, kun lavet nogle få simple rettelser. Du kan evt. prøve at se lidt på hvad det laver og hvordan det er bygget op.
Avatar billede nph12 Nybegynder
13. oktober 2003 - 21:01 #51
Jeg prøver lige at give det en chance her i ferien. Jeg skal havde lært noget mere grundlæggende, før jeg kaster mig ud i noget større.

Men kan vi lave et backup/restore script på et tidspunkt med logfil og progressbar? Man kan da godt lave en progressbar i cmd?
Avatar billede bertelbrander Novice
13. oktober 2003 - 23:13 #52
Vi kan godt lave et backup/restore script med logfil senere, men det er rarest at vide nogenlunde hvad man gør inden man begynder at flytte rundt på sine (og andres) filer.

Jeg kender ingen måde til at lave en progressbar fra en bat-fil. Man kan kun udskrive text, en linie af gangen.

Nogle forslag til øvelser:
1: Lav et script der spørger om hvad du hedder og derpå udskiver Hej "navn"

2: Udvid/ændr scriptet fra denne øvelse til at:
  2a: Liste alle filer over en given størrelse
  2b: Finde den største fil
  2c: Finde filer der ikke er fra i år.

3: Lav en menu, der f.ex ser sådan ud:
Vælg:
A: Hallo
B: Goddag
C: Hej
Hvor brugeren så skal vælge A, B eller C ved at taste A/B/C, hvorpå scriptet udskriver hvad brugeren har valgt. Husk at checke om brugeren har tastet noget ugyldigt.
Avatar billede nph12 Nybegynder
16. oktober 2003 - 00:22 #53
Nu har jeg forsøgt, men jeg er ikke helt færdig. Jeg har i første omgang kun lavet "disse filer fylder". Scriptet skriver hvor meget filer fylder, men når jeg angiver en anden sti, fylder filerne stadigvæk det samme. Hvad gør jeg forkert?

@echo off
set/a tal=0
set/a antalfiler=0
if {%1}=={} (
  echo Du skal angive en parameter
  goto :eof
)

if {%1}=={} (
for %%I in (%1\*) do call :add %%~zI
) else (
for %%I in (*) do call :add %%~zI
)

set one=%tal:~-3%
set tal=%tal:~-0,-3%
if [%tal%]==[] echo Disse filer fylde %One% & goto :eof
set Kilo=%tal:~-3%
set tal=%tal:~-0,-3%
if [%tal%]==[] echo Disse filer fylde %Kilo%.%One% & goto :eof
set Mega=%tal:~-3%
set tal=%tal:~-0,-3%
if [%tal%]==[] echo Disse filer fylde %Mega%.%Kilo%.%One% & goto :eof
set Giga=%tal:~-3%
set tal=%tal:~-0,-3%
if [%tal%]==[] echo Disse filer fylde %Giga%.%Mega%.%Kilo%.%One%
goto :eof

:add
set/a tal+=%1
set/a antalfiler+=1
Avatar billede bertelbrander Novice
16. oktober 2003 - 00:40 #54
Følgende liner skal væk, da du jo netop tillader at man undlader at angive en parameter:

if {%1}=={} (
  echo Du skal angive en parameter
  goto :eof
)

Testen i følgende vender omvendt, vi skal netop liste filer i %1\* hvis ikke %1 er tom

if {%1}=={} (
for %%I in (%1\*) do call :add %%~zI
) else (
for %%I in (*) do call :add %%~zI
)

Så du skal lave det om til:

if {%1}=={} (
for %%I in (*) do call :add %%~zI
) else (
for %%I in (%1\*) do call :add %%~zI
)

Det er grunden til at det altid skriver det samme, for det vil altid tælle summen for alle filer i * (nuværende mappe), og ikke den mappe du angiver som parameter.

En lille detalje, i slutningen af din formatering af størrelsen har du:
set tal=%tal:~-0,-3%
if [%tal%]==[] echo Disse filer fylde %Giga%.%Mega%.%Kilo%.%One%

Hvor stor kan summen af alle fil størrelser blive? Vil tal ikke altid blive sat til at være en tom streng her og testen således altid være sand?
Avatar billede nph12 Nybegynder
18. oktober 2003 - 13:57 #55
Nu kører det (næsten). Scriptet laver en lille fejl "Disse filer fylde .491.611.734". Der skal selvfølgelige ikke stå punktum foran et tal. Jeg kan ikke lige selv se fejlen.

@echo off
set/a tal=0
set/a antalfiler=0

if {%1}=={} (
for %%I in (*) do call :add %%~zI
) else (
for %%I in (%1\*) do call :add %%~zI
)

set one=%tal:~-3%
set tal=%tal:~-0,-3%
if [%tal%]==[] echo Disse filer fylde %One% & goto :eof
set Kilo=%tal:~-3%
set tal=%tal:~-0,-3%
if [%tal%]==[] echo Disse filer fylde %Kilo%.%One% & goto :eof
set Mega=%tal:~-3%
set tal=%tal:~-0,-3%
if [%tal%]==[] echo Disse filer fylde %Mega%.%Kilo%.%One% & goto :eof
set tal=%tal:~-0,-3%
if [%tal%]==[] echo Disse filer fylde %Giga%.%Mega%.%Kilo%.%One%
goto :eof

:add
set/a tal+=%1
set/a antalfiler+=1
Avatar billede bertelbrander Novice
18. oktober 2003 - 16:13 #56
Jeg kan ikke se nogen fejl og jeg kan heller ikke provokere fejlen når jeg kører det her.

Prøv at indsætte følgende før "set one=%tal:~-3%"
echo [%tal%]
echo on

Og studer det den skriver

Hvad skriver den hvis summen af størrelserne er under 1 MB, f.ex 123456, skriver den så to punktummer foran?
Avatar billede nph12 Nybegynder
19. oktober 2003 - 15:39 #57
Jeg har sæt de ekstra linier ind i scriptet. Den laver fejlen på et drev - den skrive minus i nogle af felterne.
Avatar billede bertelbrander Novice
19. oktober 2003 - 16:22 #58
Problemet er at når man regner vha. SET /A kan man ikke bruge tal større end 2147483647. Så hvis man har et drev med mere end 2G dur metoden ikke :-(

Prøv at køre kommandoen:
set /A 2147483647 + 1
i en kommando prompt og se hvad resultatet bliver.

Vi kan nu vælge at sige at "det er der ikke noget at gøre ved" eller finde en metode til at afhjælpe det problem. Det sidste er ikke helt let, men det er op til dig om du vil arbejde videre med det eller noget andet.
Avatar billede bertelbrander Novice
19. oktober 2003 - 20:23 #59
Du får lige nogle tips til hvordan du kan lave det så den kan regne med tal større end 2G.

Du skal bruge to variabler, en der tæller i giga bytes og en der tæller resten. Vi kan kalde de to variabler for giga og resten. (Vi siger at 1 giga byte er 1 000 000 000 bytes her, andre vil mene at 1 Giga byte er 1024*1024*1024 bytes.)
Husk at sætte resten og giga til at være 0 når du starter.

Når du skal lægge et nyt tal til giga og resten (i :add) skal du starte med at dele tallet op i giga og resten, det gør du ved at tage de sidste 9 cifre for sig og de øverste cifre for sig. Så lægger du de to dele til giga og resten Til slut ser du om resten er blevet større end 1000000000. Hvis den er det lægger du 1 til giga og trækker 1000000000 fra resten.

Når du skal udskrive kan du sætte giga og resten sammen til et tal, det gør du sådan:

set tal=%giga%%resten%

Hvilket er fint medmindre at:

1: giga er 0, for så vil tal blive til 0123456789, hvis resten er 123456789
2: resten er f.ex 234, for så bliver tal 1234 hvis giga er 1 (hvor de skulle være 1000000234

Så vi bliver nødt til at tage hensyn til disse tilfælde, hvilket i pseudo sprog kunne se sådan ud:

Hvis giga er 0 set tal=resten, done
Set 9 0'er foran resten (set resten=000000000%resten%)
set resten til at være de 9 sidste cifre i resten
set giga og resten sammen til tal, done
Avatar billede nph12 Nybegynder
22. oktober 2003 - 16:24 #60
Jeg har kigget på det, men synes det ser lidt svært ud. Jeg vil gerne lave det på et tidspunkt, og så om jeg selv kan løse opgaven. Kan vi ikke lade opgaven ligge lidt?

Kan vi ikke starte på en ny opgave?
Avatar billede bertelbrander Novice
22. oktober 2003 - 20:11 #61
Jo, det er vist på tide at starte på en ny opgave. Har du tænkt over hvad du vil lave?
Ellers kommer der et par forslag mere:

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.
Avatar billede nph12 Nybegynder
22. oktober 2003 - 21:08 #62
Det lyder som en god idé :-) Skal jeg oprettet et nyt sprøgsmål til dette?
Avatar billede bertelbrander Novice
22. oktober 2003 - 21:33 #63
Ja, du bør nok lige overveje om spøgsmålet hører hjemme i:

http://www.eksperten.dk/kat/333/ (programmering - script - andre) 
eller:
http://www.eksperten.dk/kat/312/ (StyreSystemer - Workstation - DOS)
eller her.
Avatar billede nph12 Nybegynder
22. oktober 2003 - 22:32 #64
Skal jeg bare oprette et spørgsmål under StyreSystemer - Workstation - DOS og kalde spørgsmålet Bat-script? Hvad skal jeg skrive af tekst til spørgsmålet?
Avatar billede bertelbrander Novice
22. oktober 2003 - 23:20 #65
Jeg tror at det vil være en god ide at oprette spørgsmålet i DOS kategorien.
Beskriv opgaven som du har valgt og beskriv hvad sprørgsmålet går ud på (at det er et spørgsmål om at lære at lave bat-scripts).
Da de fleste ting der bruges i disse scripts ikke virker på Win95/98/ME, vil jeg foreslå at du gør opmærksom på det.
Lav evt. en henvisning til dette spørgsmål.
Du kan kalde spørgsmålet "Bat programmering del 2" da dette jo er del 1.
Jeg synes at det ville være rart hvis vi kunne lokke nogle flere til at deltage.
Avatar billede nph12 Nybegynder
23. oktober 2003 - 20:02 #66
Jeg har oprettet et nyt spørgsmål: http://www.eksperten.dk/spm/417923
Avatar billede nph12 Nybegynder
23. oktober 2003 - 20:19 #67
Der er en anden som også har spurgt om på progressbar, her er på eksperten.dk (du har selv deltaget i spørgsmålet):
http://www.eksperten.dk/spm/415173

Hvis man ikke kan lave en progressbar, kan man så ikke bare lave en status over, hvor stor pct. vis der er kopieret? Hvis man ved hvor meget alle filerne fylder, kan man vel beregne hvor meget, hvor meget der er kopieret af filer?

Eks. Status 1205422/17503150 og så regne det pct. vis ud (her 6,9%)
Avatar billede bertelbrander Novice
23. oktober 2003 - 21:56 #68
Nej. Nej. Nej. Nej.
Man kan ikke lave en progress bar eller en tal der tæller op mens man laver en xcopy i et bat-script.
Avatar billede nph12 Nybegynder
09. november 2003 - 09:17 #69
lukker
Avatar billede nph12 Nybegynder
10. januar 2004 - 15:05 #70
Når man laver de fire bootdisketter under windows 2000 bruger man makeboot.exe filen til at lave disse disketter (makeboot-filen ligger på windows 200 cd´en). Makeboot-filen viser, hvor mange pct. der er kopieret ned på disketten. HVordan gør den det???
Avatar billede bertelbrander Novice
10. januar 2004 - 17:01 #71
Man kan godt lave et program (en .exe, makeboot.exe er et program) i f.ex. C++ eller VB, der laver en "progress bar" mens den kopierer, det er ikke særlig svært.

Men man kan ikke gøre det med de programmer der ligger i dos/windows.
Avatar billede nph12 Nybegynder
12. januar 2004 - 15:44 #72
Makeboot.exe kører i kommandoprompten. Nok om det, hvis man skal lave noget med en "progress bar", skal jeg lære at programmere i enten C++ eller VB?
Avatar billede bertelbrander Novice
13. januar 2004 - 01:22 #73
Man skal også lave et program (en exe) for at få en progress bar i en prompt.

Man kan lave en progressbar i mange sprog (men ikke batch), jeg kender mest til C/C++.
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