22. juli 2003 - 11:19Der er
23 kommentarer og 1 løsning
Errorlevel ved Copy
Jeg har skrevet følgende bat-fil som jeg ikke kan få til at virke...
copy c:\test.txt c:\temp if errorlevel 0 echo OK if not errorlevel 0 echo FEJL echo %errorlevel%
Når jeg kører filen skriver den altid OK, selvom filen ikke bliver kopieret (f.eks. når den ikke er der). Errorlevel er i den situation 1, for det viser den nederste kommando...
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.
copy c:\test.txt c:\temp if not errorlevel 1 echo OK if errorlevel 1 echo FEJL echo %errorlevel%
MEN, det virker IKKE under win95, og det er der jeg skal bruge bat-filen. Der bliver resultatet af ovenstående altid "OK", uanset om filen findes og kopieres eller ikke findes og deraf ikke kopieres...
Jeg vil lige afprøve det, men mit problem er at selve copy-kommandoen skal stå mange gange i bat-filen for at kopiere en fil ud til mange computere på et netværk. Efter batfilen er kørt, skal man kunne se i en log-fil hvilke computere der ikke har modtaget filen. Derudover skal man på slærmen kunne følge med i hvor langt man er nået. Hvis man laver en goto-sætning, bliver man nødt til at lave en til hver computer, så man kan komme tilbage og fortsætte bat-filen. Det er lidt bøvlet, men måske er det eneste mulighed ?
I WIN95 er det ikke muligt at få den til at komme med "fejl" Kommandoen echo %errorlevel% virker ikke den skriver bare "ECHO is off", variablerne-% er ikke med i WIN95 ?
Nogen der ved hvordan man får det til at virke i WIN95 ???
Kan du ikke lave en form for loop. i dit script? Hvis de computere har en navngivning der er et fortløbende nr f.eks. pc01, pc02, pc03, så kan man måske lave en tæller i dene stil: count=count+1 Set computer=pc%count%
copy fil.xxx \\%computer%\dest.
En lille fidus med goto er: goto answer%ERRORLEVEL% :answer0 echo Program had return code 0 :answer1 echo Program had return code 1
Er det alle former for %-variabler der ikke virker i win95? echo %errorlevel% er der vel ikke brug for, du kender errorlevel hvis du møder echo fejl. Er det den computer du skal køre scriptet på der er en win95, eller er det clienterne?
Det ser ud til at %-variable ikke virker, eller også kan jeg ikke huske hvordan man gør !
Dit lille fidus med goto, ser OK-smart ud, men desværre kan WIN95 ikke finde ud af det :-( (Den kan ikke finde label'en.) Derfor tror jeg at %-variabæe ikke virker helt som det skal. Elle som det gjorde tilbage i DOS 6.22...
Har du ikke mulighed for at køre scriptet på en win2000 maskine. Jeg tror ikke at det har nogen betydning at clienterne kører win95? En anden mulighed var at lave en boot cd med dos og så køre scriptet herfra. Du kan f.eks. benytte www.freedos.org. Jeg har ingen erfaringer med denne dos, men den er ms-dos kompatibel.
Nu da du skal kopiere over netværk skal dos'en selvfølgelig opsættes til at understøtte netværk. Hvis du ikke er skrap til netværk og dos, så kan du finde hjælp på nettet. www.google.com er din ven, søg Network Boot Disk.
Linien: if errorlevel 0 goto whatever skal læses som: "Hvis errorlevel er større end eller lig med 0, så gå til whatever. Errorlevel er altid større end eller lig med 0. Så man skal starte med at teste fra høj nummer og nedad: if errorlevel 5 goto level_5_error if errorlevel 4 goto level_4_error ...
Bertelbrander: Du har ret mht rækkefølgen i if errorlevel-sætningerne. Dette hjalp mig desværre ikke umiddelbart videre, da jeg havde prøvet at bytte om på if sætningerne.
Jeg havde dog en mistanke til errorlevel, da jeg et sted læste at det jo er forfatteren af programmet, der afgør hvilken errorlevel der returneres hvornår. Derfor var jeg interesseret i at finde ud af errorlevel hva echo %errorlevel%. Men efter nogen tids test og brug af xcopy i stedet for copy, har det vist sig at copy slet ikke returnerer noget errorlevel ! (I hvert fald i den ver. af WIN95 jeg bruger) Uanset om filen fandtes eller ej returnerede den 0. Men hvis jeg én gang lavede en xcopy, hvor den fejlede, så kom der en errorlevel 1 på alle efterfølgende copy-kommandoer. Errorlevel blev altså ikke ændret af copy.
Konklusion: Ved brug af xcopy i stedet virker det...
jnoval: Tak for de mange forskellige fejlmuligheder du kom med. Dem får du point for
Takker for point. Undskyld jeg var lidt hurtig på aftrækkeren. Toldmodighed er en dyd. Jeg kan også bedre lide at bruge xcopy. Den har også mange flere muligheder. Underligt at de ikke bare udbyggede copy i stedet for at lave xcopy:-)
Jeg brugte også xcopy mest, dengang i de glade DOS-dage, men da det var en ganske enkelt copy-funktion skænkede jeg det ikke en tanke. Men så er man blevet klogere...
xcopy har den ulempe, at det er en ekstern kommando, dvs den er ikke indbygget i kommandofortolkeren. Har du kun "en bar røv at trutte i" og ikke vil inkludere xcopy.exe på din diskette (eller hvorfra du udfører kommandoen) eller forsøge at finde stien til den, så er der fornuft i at bruge copy kommandoen.
Du kunne have overvejet følgende: if exist fil.txt copy fil.txt c:\dest if not exist fil.txt echo kunne ikke finde fil.txt >> log.txt
Du har ret mht extern kommando, men dit forslag med at bruge exist fil.txt er ikke brugbar for mig, da det er selve kopieringen der skal "logges", dvs. hvis destinationscomputeren f.eks. ikke er tændt, skal jeg få en fejl, om at den ikke er blevet kopieret til den computer.
Hvis jeg kun har en "bar røv at trutte i" så har jeg heller ikke forbindelse til resten at netværket, og så er kopieringen ikke aktuel alligevel.
Echo sætter nok også errorlevel så hvis errorlevel er 1 vil "if errorlevel 1 echo FEJL" sætte errorlevel til 0. Med EXIST som knudemand foreslår, kan du undgå errorlevel og udvide din copy med næsten alle tænkelige check.
Jeg har nu ikke oplevet at echo sætter nogen errorlevel, derimod sætter copy ingen errorlevel (i hvert fald ikke i WIN95), men muligvis har i ret. Min BAT-fil virker i hvert fald som den skal, så deeeeet... ;-)
hmmmm, hvis jeg ville være sikker på at source og destination var 100% ens ville jeg: fc c:\dir d:\dir >> log.txt Så får du en binær sammenligning af alle filer, og en fejl hvis en fil mangeler i destinationen.
den eksotiske afslutningstest ...ok, mest lavet for at blære mig med for-kommandoen, som de flest vist har glemt :-) kommendoen skal ligge i sourcemappen, og skal fyres af i en batch-fil. Fra kommandoprompt, skal %%a erstattes med %a
for %%a in (*.*) do if not exist h:\1\"%%a" echo "%%a" mangler i destinationsfolder >> log.txt
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.