Avatar billede nph12 Nybegynder
05. december 2003 - 19:33 Der er 17 kommentarer og
1 løsning

Bat programmering del 3

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

Opgaven gå ud på, at lave en log-fil som man kan bruge sammen med en eller flere xcopy kommandoer. Log-filen skal indeholde tid og dato for kopieringen, antal af filer som er kopieret, antal af fejl m.m.

ALLE er mere end velkommen til at deltage!
Avatar billede bertelbrander Novice
06. december 2003 - 00:19 #1
Du bliver vist nødt til at fortælle lidt mere præcist hvad det er du vil.
Avatar billede nph12 Nybegynder
06. december 2003 - 13:19 #2
En almindelig xcopy kommando uden logfil

xcopy/s/y "c:\Documents and Settings\Administrator\Dokumenter\*" "d:\backupdoc\"

Så tilføjer jeg ">logfil.txt" sidst i linien, så jeg får en log-fil.

xcopy/s/y "c:\Documents and Settings\Administrator\Dokumenter\*" "d:\backupdoc\" >logfil.txt

Hvis jeg tilføjer "/f" parameret til xcopy kommandoen får jeg fuld path for destination og source.

Hvordan får jeg tilføjet, hvor mange fejl der var under kopieringen?

Hvordan tilføjer jeg tid og dato for kopieringen?
Avatar billede bertelbrander Novice
06. december 2003 - 14:27 #3
De metoder jeg kender indebærer at man skal kopiere filerne en af gangen.
I del 1 og 2 har vi kikket på hvordan det gøres.

Har vi filen s.jpg der skal kopieres til c:\123 bruger vi kommandoen:

xcopy s.jpg c:\123

Hvis c:\123\s.jpg findes vil vi ikke kopiere filen. xcopy vil spørge om vi vil, men vi gidder ikke trykke n for hver fil, så vi sætter echo til at svare for os:

echo n|xcopy s.jpg c:\123

Hvis ikke filen findes (og der ikke opstår fejl) vil xcopy skrive: "1 file(s) copied." på en engelsk Win2000, danske vil skrive noget andet.

Hvis filen findes vil xcopy skrive:

Overwrite c:\123\s.jpg? (Yes/No/All): n
        0 file(s) copied.

Den del vi er intereseret i er 0/1 i linien "0/1 file(s) copied.".
Så vi sætter findstr til at finde den linie:

echo n|xcopy s.jpg c:\123 |findstr /C:"File(s) copied"

Vi er nu interesseret i tallet 0 eller 1, så vi putter kommandoen ind i en for-løkke:

for /F %%I in ('echo n^|xcopy s.jpg c:\123 ^|findstr /C:"File(s) copied"') do @echo %%I

Bemærk at vi bruger %%I fordi det er i en bat fil, og at | i kommandoen skal skrives som ^| for at undgå at batch-interpreteren laver sjov med vores |

I kommandoen ovenfor er %%I antallet af filer der blev kopieret.


Herudover kan man, f.ex. bruge:
1: if not exist c:\123\s.jpg echo fejl opstod!
2: kommandoen fc til at checke om s.jpg er det samme som c:\123\s.jpg. Det gøres ved at sætte findstr til at lede efter den text som fc skriver når den ikke finder forskelle, hvis findstr ikke finder texten sætter den errorlevel.


At tilføje tid og dato til log-filen kan gøres med:
echo %date% %timer% >>log.fil
Avatar billede nph12 Nybegynder
06. december 2003 - 15:10 #4
Under spørgsmålet "Bat programmering del 1", 11/10-2003 00:41:07 henviser du til et andet script.

Der er en del fra den log-fil, som jeg kunne bruge.
Avatar billede bertelbrander Novice
06. december 2003 - 19:45 #5
Den metode der benyttes her: http://www.eksperten.dk/spm/389684 er at putte output fra xcopy i en midlertidig fil. Filen parses så for at finde antallet af filer der blev kopieret, og indholdet skrives også til den endelige fil.

Det var måske en ide at studere scriptet grundigt, og så spørge hvis du er i tvivl om hvad det laver (scriptet er lidt langhåret).
Avatar billede nph12 Nybegynder
06. december 2003 - 21:48 #6
Kan jeg ikke starte med at "klippe" lidt i scriptet? Hvilke dele skal jeg bruge? Jeg skal vel bruge starten af sciptet + ":UpdateStat" + ":CopySingleUser" (som selvfølgelig skal hedde noget andet) eller hvad?

Jeg tror, at der er en fejl i scriptet. Scriptet skriver "Antal fejl: 0" selvom der er problemer med en af filerne "Fejl under oprettelse af fil - Processen kan ikke f† adgang til filen, da en anden proces har l†st en del af filen."
Avatar billede bertelbrander Novice
06. december 2003 - 23:19 #7
Du skal bruge UpdateStat og nok også lige kikke på CopyThisUser

Du vil kunne se at UpdateStat checker om der er kopieret nogen filer, hvis der er, sige det at der ikke er nogen fejl. Scriptet burde nok være noget mere grundig i sin fejl raportering.

Du kan evt også undersøge om xcopy sætter errorlevel hvis der er opstår problemer under kopiering.
Avatar billede nph12 Nybegynder
07. december 2003 - 17:47 #8
Er det noget i denne stil, jeg skal arbejde udfra? HVad mener du med "Scriptet burde nok være noget mere grundig i sin fejl raportering"?

@echo off
setlocal
if [%temp%]==[] set TempFile=c:\temp.tmp.tmp
if NOT [%temp%]==[] set TempFile=%temp%\temp.tmp.tmp

:CopyFile
xcopy "c:\Documents and Settings\Adminitrator\Foretrukne" "d:\Backup\Documents and Settings\Administrator\Foretrukne" /s/e /h/k/y/i/f/r/o/c >%TempFile% 2>&1
call :UpdateStat
xcopy "c:\Documents and Settings\Administrator\Dokumenter" "d:\Backup\Documents and Settings\Administrator\Dokumenter" /s/e/h/k/y/i/f/r/o/c >%TempFile% 2>&1
call :UpdateStat
echo. >>%logFile%
goto :eof

:UpdateStat
for /F %%I in (%TempFile%) do set xxx=%%I
type %TempFile%>> %logFile%
del %TempFile%
if [%xxx%]==[0] set /A NumError += 1
if not [%xxx%]==[0] set /A NumFiles += %xxx%
set xxx=
goto :eof
Avatar billede bertelbrander Novice
07. december 2003 - 19:35 #9
Ja, det er et fint sted at starte. Dog ville det nok være en ide at lave en funktion der udfører xcopy og call :UpdateStat, denne funktion kunne så kaldes med f.ex. Foretrukne, Dokumenter som parameter.

Det jeg mener er, at hvis der opstår fejl som den du beskrev, tæller den det ikke med som fejl.

Som du kan se i UpdateStat, ser scriptet blot om der står 0 som det første ord (i sidste linie) fra xcopy kommandoen, hvis der står det tælles det som en fejl, ellers (hvis f.ex. det står can't) tælles det ikke som en fejl.
Så det mindste der skal gøres er at checke om der står "xxx file(s) copied" i sidste linie.
Avatar billede nph12 Nybegynder
07. december 2003 - 21:12 #10
Det kunne være dejligt, hvis scriptet talte rigtigt. Kan ikke lige se, hvad jeg skal tilføje/rette før scriptet virker.

Det er fint med mig, hvis jeg bare selv indsætter en xcopy kommando, som de skrives nu.
Avatar billede bertelbrander Novice
07. december 2003 - 21:34 #11
Jeg beskrev 3 metoder i går ("06/12-2003 14:27:33") til at lave bedre checks.
Derudover har jeg foreslået at checke errorlevel fra xcopy.
Avatar billede nph12 Nybegynder
10. december 2003 - 16:41 #12
Jeg tror bare, at jeg bruger errorlevel fra xcopy, som vi gjorde med kamera-scriptet.

http://www.eksperten.dk/spm/417923
03/12-2003 00:39:27

Jeg tror, at jeg stopper ved det og takker mange gange for hjælpen :-)

Dog kunne jeg godt havde tænkt mig at se, hvordan scriptet (07/12-2003 17:47:56) kunne rettes til, så det talte rigtigt. Lad os bare holde her! Jeg kan ikke se, hvad jeg skal gøre ved scriptet.
Avatar billede bertelbrander Novice
11. december 2003 - 00:03 #13
Man kan tælle antallet af filer i mappen og checke om der blev kopieret det samme antal:

@echo off
for /F %%I in ('dir * ^|findstr File^(s^)') do set NumFiles=%%I
for /F %%I in ('xcopy /I /Y /C * c:\123 2^>nul^|findstr File^(s^)') do set NumCopied=%%I

if not %NumFiles% EQU %NumCopied% (
  echo Der opstod et problem!
  echo Der er %NumFiles% filer, men der blev kun kopieret %NumCopied%
)

Bermærk at min Win2000 er snakker engelsk.

Man kunne også udnytte at xcopy skriver fejlbeskeder til stderr (2) og almindelig information til stdout (1, der her bliver ignoreret):

xcopy /I /Y /C * c:\123 1>nul 2>tt.tt
for /F %%I in ('dir /B tt.tt') do if %%~zI GTR 0 (
  Echo Der opstod et problem:
  type tt.tt
)

Hvis man vil være ekstra grundig, kan man sammenligne filerne en for en efter kopiering:

for %%I in (*) do (
  fc %%I C:\123\%%I |findstr "FC: no differences encountered" >nul 2>&1
  if errorlevel 1 (
    echo Filerne %%I og c:\123\%%I er ikke ens!
  )
)

Det burde være simpelt at tilføje dette til scriptet "07/12-2003 17:47:56"
Avatar billede nph12 Nybegynder
12. december 2003 - 15:23 #14
"Det burde være simpelt at tilføje dette til scriptet "07/12-2003 17:47:56"", men jeg kan stadigvæk ikke se, hvad jeg skal gøre.

Hvis strukturen skal holdes i scriptet "07/12-2003 17:47:56", hvordan får jeg log-filen til at virke? Jeg skal vel rette ":UpdateStat", men er der andre ting som skal tilføjes eller rettes?

Jeg må ærlig indrømme, at jeg stort set kun forstår xcopy kommandoen, som der så kalder ":UpdateStat" (som jeg ikke helt forstår, hvad gør). Jeg vil godt kunne rette i xcopy kommandoen til det, som jeg skal bruge scriptet til.
Avatar billede bertelbrander Novice
13. december 2003 - 00:39 #15
Ok, simpelt er måske ikke det rigtige ord...

I hver xcopy linie bliver output, både stderr og stdout puttet i filen med navnet %TempFile%

Man kunne beskrive det UpdateStat gør med pseudo sprog som følgende:

For hver linie i TempFile sættes xxx til at være det første ord.
Udskriv TempFile til %LogFile%
Slet LogFile
Hvis xxx er 0 tælles NumError en op
Hvis ikke xxx er 0 lægges xxx til NumFiles

Filosofien er at den sidste linie i TempFile er f.ex. "9 file(s) copied."
Det første ord denne linie er antallet af filer der blev kopieret. Hvis ikke der blev kopieret nogen filer opfattes det som en fejl. Som jeg skrev tidligere er det nok ikke en tilstrækkelig grundig test. På den anden side bliver alt output fra xcopy kommandoen putttet i logfilen også.

Grunden til at vi bruger en midlertidig fil er at vi skal bruge output to gange, en gang for at se hvor mange filer der blev kopieret og en gang for at putte den i den endelige logfil.

Jeg vil foreslå at du laver det om, så output fra xcopy bliver puttet i to forskellige filer, en med normal output (1) og en med error output(2).

Normal output skal bruges til det som  UpdateStat gør nu.
Error output skal bruges til det jeg foreslog med tt.tt i "11/12-2003 00:03:56"

Husk at putte både output fra normal og error output i den endelige logfil.

Derudover vil jeg foreslå at du checker errorlevel fra xcopy og skriver en besked i den endlige logfil hvis den ikke er 0, ca:
if errorlevel 1 echo Der opstod en fejl. >>%LogFile%
Avatar billede nph12 Nybegynder
20. december 2003 - 22:51 #16
Jeg har kigget lidt på det og tror, at jeg holder mig til errorlevel-scriptet. Det er godt nok til mit behov. Jeg takker rigtigt mange gange for hjælpen.
Avatar billede nph12 Nybegynder
22. december 2003 - 14:02 #17
Hvis du har lyst, kan du måske hjælpe mig med dette spørgsmål.
http://www.eksperten.dk/spm/442289

Kender du noget til PC dos?
Avatar billede nph12 Nybegynder
23. december 2003 - 21:30 #18
Lukker
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