13/11/2001
At forstå operatører er en fundamental del af at skrive effektive og dynamiske batch-scripts. En operatør er et symbol, der instruerer kommandofortolkeren (cmd.exe) i at udføre specifikke matematiske, logiske eller sammenlignende handlinger. Uden dem ville vores scripts være simple, lineære sekvenser af kommandoer. Med dem kan vi skabe logik, håndtere data og træffe beslutninger baseret på forskellige betingelser. Denne artikel vil guide dig igennem de forskellige typer af operatører, der er tilgængelige i batch-programmering, fra de grundlæggende aritmetiske operatører til de mere komplekse relationelle og bitvise operatører, komplet med eksempler og forklaringer for at give dig en dybdegående forståelse.
Aritmetiske Operatører
Aritmetiske operatører bruges til at udføre matematiske beregninger. I batch-scripts udføres disse operationer typisk ved hjælp af SET /A kommandoen, som evaluerer et aritmetisk udtryk.
| Operatør | Beskrivelse | Eksempel | Resultat |
|---|---|---|---|
| + | Addition | SET /A resultat = 10 + 5 | 15 |
| - | Subtraktion | SET /A resultat = 10 - 5 | 5 |
| * | Multiplikation | SET /A resultat = 10 * 5 | 50 |
| / | Division | SET /A resultat = 10 / 5 | 2 |
| % | Modulus (rest ved division) | SET /A resultat = 10 % 3 | 1 |
Her er et praktisk eksempel på, hvordan man bruger dem i et script:
@echo off SET /A tal1 = 20 SET /A tal2 = 4 SET /A sum = %tal1% + %tal2% SET /A produkt = %tal1% * %tal2% echo Summen er: %sum% echo Produktet er: %produkt%Operatørernes Rækkefølge (Præcedens)
Ligesom i almindelig matematik følger batch-scripting en bestemt rækkefølge for operationer. Rækkefølgen er typisk:
- Multiplikation (*), Division (/), Modulus (%)
- Addition (+), Subtraktion (-)
Du kan bruge parenteser () til at tilsidesætte denne standardrækkefølge og tvinge en bestemt del af et udtryk til at blive evalueret først.
@echo off REM Uden parentes: 5 * 2 evalueres først SET /A resultat1 = 10 - 5 * 2 echo Resultat 1: %resultat1% (10 - 10 = 0) REM Med parentes: 10 - 5 evalueres først SET /A resultat2 = (10 - 5) * 2 echo Resultat 2: %resultat2% (5 * 2 = 10)Relationelle Operatører og Sammenligning
Relationelle operatører er afgørende for at træffe beslutninger i scripts. De bruges næsten altid inden i en IF-sætning til at sammenligne to værdier. En vigtig pointe er forskellen mellem ren streng-sammenligning og numerisk sammenligning.
Strengsammenligning med ==
Operatøren == bruges til at sammenligne, om to strenge er identiske. Kommandoen IF har som standard kun to operatører: == for lighed og NOT til at invertere resultatet.
IF "%brugernavn%"=="Admin" ECHO Velkommen, administrator! IF NOT "%svar%"=="JA" ECHO Handlingen blev annulleret.Bemærk, at det er god praksis at omgive variabler og strenge med dobbelte anførselstegn. Dette forhindrer fejl, hvis en variabel er tom.
Numerisk og Strengsammenligning
Med kommandoudvidelser aktiveret (hvilket er standard), får du adgang til et mere robust sæt af sammenligningsoperatorer, der kan håndtere både tal og strenge.
| Operatør | Beskrivelse | Eksempel |
|---|---|---|
| EQU | Er lig med | IF %tal1% EQU %tal2% |
| NEQ | Er ikke lig med | IF %tal1% NEQ %tal2% |
| LSS | Mindre end | IF %tal1% LSS %tal2% |
| LEQ | Mindre end eller lig med | IF %tal1% LEQ %tal2% |
| GTR | Større end | IF %tal1% GTR %tal2% |
| GEQ | Større end eller lig med | IF %tal1% GEQ %tal2% |
Når du bruger disse operatører, forsøger cmd.exe først at konvertere begge værdier til 32-bit signerede heltal. Hvis det lykkes for begge, udføres en numerisk sammenligning. Hvis en af værdierne ikke kan konverteres til et tal (f.eks. indeholder bogstaver), udføres en strengsammenligning i stedet.
Dette kan føre til uventede resultater:
REM Numerisk sammenligning: 20 er større end 100 IF 20 GTR 100 (ECHO 20 er større end 100 - numerisk) ELSE (ECHO 20 er IKKE større end 100 - numerisk) REM Strengsammenligning: "20" kommer efter "100" alfabetisk IF "20" GTR "100" (ECHO "20" er større end "100" - streng) ELSE (ECHO "20" er IKKE større end "100" - streng)I strengsammenligningen sammenlignes tegn for tegn. Da '2' kommer efter '1', vurderes "20" til at være "større" end "100".
Håndtering af Store Tal
Den numeriske sammenligning er begrænset til 32-bit signerede heltal (fra -2.147.483.648 til 2.147.483.647). Hvis du skal sammenligne større tal, f.eks. filstørrelser over 2 GB, skal du bruge en smart teknik med strengsammenligning. Tricket er at sikre, at begge strenge har samme længde ved at tilføje foranstillede nuller.
@echo off setlocal REM Simulerer en stor filstørrelse set "FileSize=3000000000" REM Tilføj foranstillede nuller for at sikre en fast længde (f.eks. 16 tegn) set "PaddedFileSize=0000000000000000%FileSize%" set "PaddedFileSize=%PaddedFileSize:~-16%" set "TwoGiB=0000002147483648" IF "%PaddedFileSize%" GEQ "%TwoGiB%" ( echo Filstørrelsen er 2 GiB eller større. ) ELSE ( echo Filstørrelsen er mindre end 2 GiB. ) endlocalLogiske og Omdirigeringsoperatorer
Disse operatører styrer flowet af kommandoer og deres input/output.
Omdirigeringsoperatorer (Redirection)
Omdirigering giver dig mulighed for at ændre, hvor en kommandos output sendes hen, eller hvor den får sit input fra.
>: Sender output til en fil (overskriver filen, hvis den eksisterer).>>: Sender output til en fil (tilføjer til slutningen af filen).<: Læser input fra en fil i stedet for tastaturet.
REM Gemmer en liste over filer i dir.txt (overskriver) DIR > dir.txt REM Tilføjer systeminformation til den samme fil SYSTEMINFO >> dir.txt REM Sorterer indholdet af en fil navngivet numre.txt SORT < numre.txtKommando-kæde Operatører
Disse bruges til at køre flere kommandoer på en enkelt linje, baseret på succesen af den foregående kommando.
&&: Kører den næste kommando KUN HVIS den forrige lykkedes (returnerede en exit code på 0).||: Kører den næste kommando KUN HVIS den forrige fejlede (returnerede en exit code forskellig fra 0).
REM Prøv at oprette en mappe. Hvis det lykkes, skift til den. MD NyMappe && CD NyMappe REM Tjek om en fil findes. Hvis ikke, giv en fejlmeddelelse. DIR minfil.txt || ECHO Fejl: minfil.txt blev ikke fundet!Bitvise Operatører
Bitvise operatører arbejder på det binære niveau af tal. De bruges sjældnere i simple scripts, men er kraftfulde til mere avancerede formål. De bruges også med SET /A.
| Operatør | Navn | Beskrivelse |
|---|---|---|
| & | Bitvis AND | Sætter en bit til 1, hvis begge tilsvarende bits er 1. |
| | | Bitvis OR | Sætter en bit til 1, hvis en af de tilsvarende bits er 1. |
| ^ | Bitvis XOR | Sætter en bit til 1, hvis kun en af de tilsvarende bits er 1. |
Eksempel: SET /A resultat = 10 & 12 (Binært: 1010 & 1100 = 1000, hvilket er 8 decimalt).
Tildelingsoperatorer
Disse er praktiske genveje, der kombinerer en aritmetisk operation med en tildeling til den samme variabel. De skal bruges med SET /A.
| Operatør | Eksempel | Svarer til |
|---|---|---|
| += | x += 5 | x = x + 5 |
| -= | x -= 3 | x = x - 3 |
| *= | x *= 2 | x = x * 2 |
| /= | x /= 4 | x = x / 4 |
| %= | x %= 2 | x = x % 2 |
@echo off SET /A score = 100 echo Start score: %score% SET /A score += 50 echo Score efter bonus: %score% SET /A score /= 2 echo Score efter halvering: %score%Ofte Stillede Spørgsmål (FAQ)
Hvad er den primære forskel på `==` og `EQU`?
== udfører altid en ren tekstbaseret strengsammenligning. "10" er lig med "10", men ikke " 10". EQU forsøger først at lave en numerisk sammenligning. Hvis begge værdier kan tolkes som tal, vil `10` være lig med `010`. Hvis en af dem ikke er et gyldigt heltal, falder EQU tilbage til en strengsammenligning, der ligner ==.
Hvorfor virker min `IF %tal% GTR 08` kommando ikke som forventet?
Når `cmd.exe` ser et tal, der starter med `0`, forsøger den at tolke det som et oktalt (8-talsystem) tal. Oktale tal bruger kun cifrene 0-7. Da `08` indeholder et `8`, er det et ugyldigt oktalt tal. Dette får `IF`-sætningen til at fejle konverteringen og falde tilbage til en strengsammenligning, hvilket kan give uforudsigelige resultater. Undgå foranstillede nuller, medmindre du bevidst arbejder med oktale tal.
Hvad er fordelen ved at bruge `&&` og `||`?
De gør din kode mere kompakt og læsbar. I stedet for at skrive en `IF ERRORLEVEL` blok efter hver kommando for at tjekke for succes eller fiasko, kan du kæde kommandoer sammen på en enkelt linje. Dette er ideelt til simpel fejlhåndtering eller til at sikre, at en sekvens af afhængige operationer kun fortsætter, hvis hvert trin lykkes.
Hvordan bruger jeg `NOT` operatøren?
NOT bruges til at invertere en betingelse i en IF-sætning. Det gør en sand betingelse falsk og omvendt. Det er især nyttigt til at tjekke, om noget *ikke* er tilfældet. Eksempel: IF NOT EXIST fil.txt ECHO Filen mangler!. Dette er ofte mere læseligt end at bruge en `ELSE`-blok.
Hvis du vil læse andre artikler, der ligner Mestring af Operatører i Batch Scripting, kan du besøge kategorien Sundhed.
