Check for null variabel i Windows batch

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder med en Windows-batchfil, der vil bcp tre tekstfiler i SQL Server. Hvis noget går galt i produktionen, vil jeg kunne tilsidesætte filnavnet. Så jeg tænker på at gøre noget som dette.


bcp.exe MyDB..MyTable1 in \%1 -SMyServer -T -c -m0
bcp.exe MyDB..MyTable2 in \%2 -SMyServer -T -c -m0
bcp.exe MyDB..MyTable3 in \%3 -SMyServer -T -c -m0


Jeg vil gerne kunne indtaste standardnavne for alle tre filer, der skal bruges, hvis positionsparametrene ikke leveres. Ideen ville enten være at udføre


myjob.bat


uden parametre, og få det til at bruge standardværdierne, eller udfør


myjob.bat "c:myfile1" "c:myfile2" "c:myfile3"


og få det til at bruge disse filer. Jeg har ikke kunnet finde ud af, hvordan man kan fortælle om\% 1,\% 2 og\% 3 eksisterer og/eller er null. Jeg ved heller ikke hvordan man sætter disse værdier betinget. Er dette muligt? Eventuelle forslag ville blive værdsat.

Bedste reference


For at teste for eksistensen af ​​en kommandolinjeparameter skal du bruge tomme parenteser:


IF [\%1]==[] echo Value Missing


eller


IF [\%1] EQU [] echo Value Missing


SS64-siden på IF hjælper dig her. Under 'Er der\% 1?'. [13]


Du kan ikke indstille en positionsparameter, så hvad du skal gøre er at gøre noget lignende


SET MYVAR=\%1


Du kan derefter genindstille MYVAR baseret på indholdet.

Andre referencer 1


Begge svar er korrekte, men jeg gør min lidt anderledes. Du vil måske overveje et par ting ...


Start partiet med:


SetLocal


og afslut med det


EndLocal


Dette vil holde alle dine 'SET'er' gyldige i løbet af den aktuelle session og vil ikke forlade vars venstre navngivne navn som 'FileName1' eller andre variable, du har angivet under kørslen, hvilket kunne forstyrre den næste runde af batchfilen . Så kan du gøre noget som:


IF "\%1"=="" SET FileName1=c:file1.txt


Det andet trick er, hvis du kun leverer 1 eller 2 parametre, brug SHIFT-kommandoen til at flytte dem, så den du leder efter er altid på\% 1 ...


For eksempel behandle den første parameter, skift dem, og gør det igen. På denne måde er du ikke hardkodende\% 1,\% 2,\% 3 osv. ...


Windows-batchprocessoren er meget kraftigere end folk giver det kredit for. Jeg har lavet nogle vanvittige ting med det, herunder beregning af gårdagens dato, selv på tværs af måneds- og årsgrænser inklusive Leap Year, og lokalisering mv.


Hvis du virkelig ønsker at blive kreativ, kan du ringe til funktioner i batchprocessoren ... Men det er virkelig for en anden diskussion ... :)


Åh, og hed ikke dine batch-filer .bat enten. De er .cmd 's nu .. hej ..


Håber dette hjælper.

Andre referencer 2


Det rigtige ville være at bruge en 'hvis defineret' erklæring, som bruges til at teste for eksistensen af ​​en variabel. For eksempel:


IF DEFINED somevariable echo Value exists


I dette særlige tilfælde skal den negative form anvendes:


IF NOT DEFINED somevariable echo Value missing


PS: variablenavnet skal bruges uden '\%' tegn.

Andre referencer 3


rem set defaults:
set filename1="c:file1.txt"
set filename2="c:file2.txt"
set filename3="c:file3.txt"
rem set parameters:
IF NOT "a\%1"=="a" (set filename1="\%1")
IF NOT "a\%2"=="a" (set filename2="\%2")
IF NOT "a\%3"=="a" (set filename1="\%3")
echo \%filename1\%, \%filename2\%, \%filename3\%


Pas på med citat tegn, selvom du måske har brug for dem i dine variabler.