Windows Batch-filer: hvis andet

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg gør en enkel batchfil, der kræver et argument (du kan give mere, men jeg ignorerer dem).


Til test er dette det, jeg har hidtil.


if not \%1 == "" (
    dir /s/b \%1
) else (
    echo no
)


I grund og grund vil jeg sige, om der gives et argument, viser rekursivt alle filer i mappen. Ellers siger nej.


Det virker, når jeg giver et argument, men hvis jeg ikke giver en det, vil jeg bare fortælle mig ( was unexpected at this time.


Jeg mener, det virker, men jeg ville i det mindste vise en brugervenlig besked, der forklarer hvorfor det ikke virker. Hvordan skal jeg ændre koden?

Bedste reference


if not \%1 == "" (


må være


if not "\%1" == "" (


Hvis et argument ikke er givet, er det helt tomt, ikke engang "" (som repræsenterer en tom streng i de fleste programmeringssprog). Så vi bruger de omkringliggende citater til at opdage et tomt argument.

Andre referencer 1


Omgiver din \%1 med noget.


F.eks:


if not "\%1" == ""


En anden jeg har set ret ofte:


if not {\%1} == {}


Og så videre...


Problemet, som du sandsynligvis kan gætte, er, at \%1 er bogstaveligt erstattet af tomhed. Det er ikke 'en tom streng' det er faktisk et tomt punkt i din kildefil på det tidspunkt.


Så efter udskiftningen forsøger tolken at fortolke if erklæringen og bliver forvirret.

Andre referencer 2


Du skal gøre følgende:


if "\%1" == "" (
    echo The variable is empty
) ELSE (
    echo The variable contains \%1
)

Andre referencer 3


Et andet relateret tip er at bruge '\% ~ 1' i stedet for '\% 1'. Skriv 'CALL/?' på kommandolinjen i Windows for at få flere detaljer.

Andre referencer 4


Et alternativ ville være at indstille en variabel, og kontrollere om den er defineret:


SET ARG=\%1
IF DEFINED ARG (echo "It is defined: \%1") ELSE (echo "\%\%1 is not defined")


Desværre bruger \%1 direkte med DEFINED ikke.

Andre referencer 5


du skal gøre sådan her ...


hvis ikke 'A\% 1' == 'A'


hvis input argumentet\% 1 er null,
din kode vil have et problem.