windows - Hvorfor er min IF sammenligning op svigtende?

Indlæg af Hanne Mølgaard Plasc

Problem



opdater SOLVED - problemet er ikke med min kode. Der er en designbegrænsning (nogle kan sige 'fejl') i kommandoprocessoren. IF-sammenligningsoperatørerne arbejder ikke med værdier højere end 2147483648. Nu skal jeg bare finde ud af, hvordan man fjerner nogle af de mindst signifikante cifre for løsningen. tak til alt for læsning.


=======


hej derude i cyberland


Jeg administrerer et lille virksomheds netværk. Jeg forsøger at oprette en automatiseret arkivproces ved hjælp af en batchfil, der kører på en server, og har brug for lidt hjælp med logikken. Jeg er ikke en programmør og har ikke tid til at lære PowerShell eller VBscript. Jeg har læst og genlæst MS kommandoen reference på IF, FOR og CALL, og kan ikke finde ud af, hvad jeg gør galt.


Vi har en Windows 2000-server med to diskdrev og et bånddrev. En disk har en delt mappe, kald den Offentlig; den anden disk er ikke delt, kald det Staging.


Det offentlige drev accepterer indgående sikkerhedskopier fra klientens stationære computere. Jeg har brug for processen til at flytte filer fra Public Drive til Staging-drevet, indtil drevet er for fuld til at acceptere flere filer, hvorefter tape backup starter. Efter afslutningen af ​​båndkørslen tømmes stationsdriveren, og processen genoptages i bevægelse af filer fra Offentlig til Staging.


Målet er at automatisk og evigt arkivere de stationære backupfiler til bånd, uden brugerintervention andet end at ændre båndet.


Du kan spørge, hvorfor involvere to drev? To grunde:


1) Hvis desktopsne sikkerhedskopieres direkte til staging-drevet, vil klientens stationære sikkerhedskopiering på noget tidspunkt mislykkes, fordi der ikke er plads på måldrevet. Jeg har ingen måde at forudse, hvornår dette vil ske Den eneste definerbare tilstand, jeg kan tænke på, ville være en vilkårlig tærskel for ledig diskplads, men da backupfilerne, der skal arkiveres, vil være forskellige størrelser, kan jeg løbe ind i en situation, hvor målstationen ledig plads er over tærsklen, men næste backup overstiger det pågældende rum. Resultat: Klient-desktop backup mislykkes, og server tape backup starter ikke.


2) Hvis Staging-drevet fyldes op, og tapet backup ikke af en eller anden grund (tape ikke ændret eller hvad som helst), når du har skrivebordene sikkerhedskopieret til Public Drive, køber jeg mig tid til at løse båndproblemet, før skrivebordsbackuperne begynder at mislykkes.


Her er algoritmen, jeg forsøger at kode:


1) Begynd


2) Få ledig plads på Staging-drev


3) Hent størrelse af mindste fil på Offentlig drev (hvis der ikke er nogen filer til stede, exit)


4) Sammenlign filstørrelse med ledig plads på Staging-drev


5) Hvis filen passer, skal du flytte den til Staging drive; Ellers skal du afslutte og starte Tape Backup


6) vende tilbage til Begynd


Og her er min batch kode, som ikke virker. På dette tidspunkt i testen har jeg en fil (8 GB) i den offentlige drev, som passer ind i det ledige rum (32 GB) på Staging-drevet. Den angivne kommando bekræfter, at variablerne er indstillet som forventet; processen mangler i sætningen [[hvis\% BKFsize\% LSS\% DiskFree\% ']]. Istedet for den fil, der flyttes, kaldes den båndrutine, der er specificeret af' ellers 'i stedet:


@echo off
setlocal enableextensions enabledelayedexpansion
:Begin
REM   obtain and display free space on Staging drive.
D:
for /f "tokens=3 delims= " \%\%A in ('dir ^| find "bytes free"') do (
set Z=\%\%A
set Z=!Z:,=!
)
set DiskFree=!Z!
echo.
echo D: has \%DiskFree\% bytes free
echo.
REM   obtain sizes of files on Public drive to be moved.
E:
cd ackup.email
if not exist *.bkf exit
dir *.bkf /b /os > BKFlist.txt
for /f "tokens=*" \%\%G in (BKFlist.txt) do call :CheckBKF "\%\%G"
goto :eof
:CheckBKF
set BKFfile=\%1
set BKFsize=\%~z1
echo.
echo File \%BKFfile\% is \%BKFsize\% bytes
echo.
set
pause
REM   move file(s) to Staging drive, space permitting; or, 
REM   if not enough space for smallest file, start tape backup.
if \%BKFsize\% LSS \%DiskFree\% (
echo Moving file \%BKFfile\% to drive D
echo.
move E:ackup.email\%BKFfile\% D:ackup.email
) else (
C:WINNTAutoBackupTapeBKF.cmd
exit
)
goto Begin
:End


Jeg ved, at dette skal være ret simpelt, men som jeg sagde, jeg er ikke en programmør, og jeg bøjer til din overlegne dygtighed. Eventuelle råd er meget værdsat og tak.

Bedste reference


I batch-fil er der ingen reel forskel mellem strenge og heltalstyper, men det er ikke dit problem her.


Problemet er, at heltal kun virker i det 32-bitede underskrevne interval.

-2147483648 til 2147483647


Men din filstørrelse er større og også din diskplads.
For at teste dette kan du prøve at tilføje en.


Set /a myvar=BKFsize+1
Set /a myvar=DiskFree+1


Jeg formoder, at du får en fejl.


Du kan løse det, hvis du forsøger at bruge strengen, sammenlignes i øjeblikket med en streng, men dine tal er ikke af samme længde, så du får 'uforudsigelige' resultater.

Men hvis du justerer/fylder strengene med nuller, så de har samme længde, skal det fungere.


set "strBKSize=000000000000000000\%bkSize\%"
set "strBKSize=\%strBKSize:~-15\%"
set "strDisksize=000000000000000000\%Disksize\%"
set "strDisksize=\%strDisksize:~-15\%"


Eller du forsøger at beregne ikke med bytes, men i MB eller GB, ved at fjerne 6 eller 9 tal/tegn.


set BKFsizeGB=\%BKFsize:~0,-9\%


Så kan du bruge dem som tal.

Andre referencer 1


Måske er værdierne i dine variabler ikke heltal, men strenge


Jeg antager, at det er at sammenligne: 8 < 3 == false