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.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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:
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
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).
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."
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.
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
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.
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.
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"
"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.
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%
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.
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.