Quelle est la bonne façon de tester si un paramètre est vide dans un fichier batch?

je dois tester si une variable est définie ou non. J'ai essayé plusieurs techniques mais elles semblent échouer chaque fois que %1 est entouré de citations comme le cas où %1 est "c:some path with spaces" .

IF NOT %1 GOTO MyLabel // This is invalid syntax
IF "%1" == "" GOTO MyLabel // Works unless %1 has double quotes which fatally kills bat execution
IF %1 == GOTO MyLabel // Gives an unexpected GOTO error.

selon ce site , ce sont les types de syntaxe supportés IF . Donc, je ne vois pas un moyen de le faire.

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
159
demandé sur Stephan 2010-03-30 02:46:36

16 réponses

utiliser des crochets au lieu de guillemets:

IF [%1] == [] GOTO MyLabel

les parenthèses sont insécurité : utilisez seulement les crochets.

223
répondu Dan Story 2017-05-12 21:52:18

vous pouvez utiliser:

IF "%~1" == "" GOTO MyLabel

pour rayer l'ensemble extérieur des guillemets. En général, ce est une méthode plus fiable que l'utilisation de crochets, car il fonctionnera même si la variable a des espaces.

107
répondu jamesdlin 2017-08-17 20:34:27

L'une des meilleures solutions semi est de copier %1 dans une variable et ensuite utiliser l'expansion retardée, comme delayedExp. est toujours en sécurité à l'encontre de tout contenu.

set "param1=%~1"
setlocal EnableDelayedExpansion
if "!param1!"=="" ( echo it is empty )
rem ... or use the DEFINED keyword now
if defined param1 echo There is something

l'avantage de ceci est que traiter avec param1 est absolument sûr.

et le param1 fonctionne dans de nombreux cas, comme

test.bat hello"this is"a"test
test.bat you^&me

mais il échouera avec des contenus étranges comme

test.bat "&"^&

si vous voulez être à 99% à l'épreuve des balles vous pouvez lire Comment recevoir même les paramètres les plus étranges de la ligne de commande?

28
répondu jeb 2017-05-23 12:10:44

De SI /?:

si les Extensions de commandes sont activées si

IF [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command

......

les œuvres conditionnelles définies juste comme existe sauf qu'il faut un nom de la variable d'environnement et retours vrai si la variable d'environnement est définir.

14
répondu Andy Morris 2010-03-30 12:08:45

utiliser" si défini la commande variable " pour tester la variable dans le fichier de lot.

mais si vous voulez tester les paramètres du lot, essayez les codes ci-dessous pour éviter les entrées délicates (comme "1 2" ou ab^>cd)

set tmp="%1"
if "%tmp:"=.%"==".." (
    echo empty
) else (
    echo not empty
)
4
répondu zackz 2014-08-13 14:35:57

chaîne vide est une paire de double-quotes / "" , nous pouvons juste tester la longueur:

set ARG=%1
if not defined ARG goto nomore

set CHAR=%ARG:~2,1%
if defined CHAR goto goon

puis tester ses 2 caractères contre double-quotes :

if ^%ARG:~1,1% == ^" if ^%ARG:~0,1% == ^" goto blank
::else
goto goon

voici un script batch avec lequel vous pouvez jouer. Je pense qu'il attrape correctement la corde vide.

c'est juste un exemple, vous avez juste besoin de personnaliser 2 (ou 3?) pas ci-dessus selon votre script.

@echo off
if not "%OS%"=="Windows_NT" goto EOF
:: I guess we need enableExtensions, CMIIW
setLocal enableExtensions
set i=0
set script=%0

:LOOP
set /a i=%i%+1

set A1=%1
if not defined A1 goto nomore

:: Assumption:
:: Empty string is (exactly) a pair of double-quotes ("")

:: Step out if str length is more than 2
set C3=%A1:~2,1%
if defined C3 goto goon

:: Check the first and second char for double-quotes
:: Any characters will do fine since we test it *literally*
if ^%A1:~1,1% == ^" if ^%A1:~0,1% == ^" goto blank
goto goon

:goon
echo.args[%i%]: [%1]
shift
goto LOOP

:blank
echo.args[%i%]: [%1] is empty string
shift
goto LOOP

:nomore
echo.
echo.command line:
echo.%script% %*

:EOF

This résultat du test de torture:

.test.bat :: ""  ">"""bl" " "< "">"  (")(") "" :: ""-"  " "( )"">\>" ""
args[1]: [::]
args[2]: [""] is empty string
args[3]: [">"""bl" "]
args[4]: ["< "">"]
args[5]: [(")(")]
args[6]: [""] is empty string
args[7]: [::]
args[8]: [""-"  "]
args[9]: ["( )"">\>"]
args[10]: [""] is empty string

command line:
.test.bat :: ""  ">"""bl" " "< "">"  (")(") "" :: ""-"  " "( )"">\>" ""
2
répondu user6801759 2016-10-07 04:41:10

malheureusement je n'ai pas assez de réputation pour commenter ou voter sur les réponses actuelles à j'ai dû écrire la mienne.

à l'origine, la question de l'OP disait" variable "plutôt que" paramètre", ce qui est devenu très confus, d'autant plus qu'il s'agissait du lien Numéro un dans google pour la recherche Comment tester pour les variables Vierges. Depuis ma réponse originale, Stephan a modifié la question originale pour utiliser la terminologie correcte, mais plutôt que de supprimer ma réponse, j'ai décidé laisser cela pour aider à dissiper toute confusion, surtout au cas où google envoie encore des gens ici pour des variables aussi:

%1 IS NOT A VARABLE! C'EST UN PARAMÈTRE DE LIGNE DE COMMANDE.

distinction très importante. Un signe de pourcentage simple avec un nombre après qu'il se réfère à un paramètre de ligne de commande pas une variable.

les Variables sont définies en utilisant la commande set, et sont rappelées en utilisant des signes de 2 pour cent - un avant et un après. Par exemple % myvar%

pour tester une variable vide, vous utilisez la syntaxe "if not defined" (les commandes explicitement pour les variables n'exigent pas de signes de pourcentage), par exemple:

set myvar1=foo  
if not defined myvar1 echo You won't see this because %myvar1% is defined.  
if not defined myvar2 echo You will see this because %myvar2% isn't defined.

(si vous voulez tester les paramètres de la ligne de commande, je vous recommande de vous référer à la réponse de jamesdlin.)

2
répondu user3343110 2018-07-27 14:18:23

j'utilise habituellement ceci:

IF "%1."=="." GOTO MyLabel

Si %1 est vide, le SI se comparer "." de." "qui permettra d'évaluer la valeur true.

1
répondu aphoria 2010-03-30 00:26:03

Script 1:

Entrée ("Supprimer Les Guillemets.cmd", "Ceci est un Test")

@ECHO OFF

REM Set "string" variable to "first" command line parameter
SET STRING=%1

REM Remove Quotes [Only Remove Quotes if NOT Null]
IF DEFINED STRING SET STRING=%STRING:"=%

REM IF %1 [or String] is NULL GOTO MyLabel
IF NOT DEFINED STRING GOTO MyLabel


REM   OR   IF "." equals "." GOTO MyLabel
IF "%STRING%." == "." GOTO MyLabel

REM GOTO End of File
GOTO :EOF

:MyLabel
ECHO Welcome!

PAUSE

sortie (il n'y a aucun, %1 n'était pas blanc, vide, ou NULL):


Run ("Supprimer Les Guillemets.cmd") sans aucun paramètre avec le script ci-dessus 1

sortie (%1 est blanc, vide, ou NULL):

Welcome!

Press any key to continue . . .

Note: Si vous définissez une variable à l'intérieur une déclaration IF ( ) ELSE ( ) , elle ne sera pas disponible pour défini avant qu'elle ne sorte de la déclaration" si " (à moins que "Delayed Variable Expansion" ne soit activée; une fois activée, utilisez un point d'exclamation "!"à la place de l' % symbole"%"}.

par exemple:

Script 2:

Entrée ("Supprimer Les Guillemets.cmd", "Ceci est un Test")

@ECHO OFF

SETLOCAL EnableDelayedExpansion

SET STRING=%0
IF 1==1 (
  SET STRING=%1
  ECHO String in IF Statement='%STRING%'
  ECHO String in IF Statement [delayed expansion]='!STRING!'
) 

ECHO String out of IF Statement='%STRING%'

REM Remove Quotes [Only Remove Quotes if NOT Null]
IF DEFINED STRING SET STRING=%STRING:"=%

ECHO String without Quotes=%STRING% 

REM IF %1 is NULL GOTO MyLabel
IF NOT DEFINED STRING GOTO MyLabel

REM GOTO End of File
GOTO :EOF

:MyLabel
ECHO Welcome!

ENDLOCAL
PAUSE

sortie:

C:\Users\Test>"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd" "This is a Test"  
String in IF Statement='"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"'  
String in IF Statement [delayed expansion]='"This is a Test"'  
String out of IF Statement='"This is a Test"'  
String without Quotes=This is a Test  

C:\Users\Test>  

Note: il supprimera également les guillemets de l'intérieur de la chaîne.

par exemple (en utilisant le script 1 ou 2): C:\Users\Test\Documents\Batch Fichiers> " Supprimer Les Guillemets.cmd", "C'est "un" Test"

Sortie (Script 2):

String in IF Statement='"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"'  
String in IF Statement [delayed expansion]='"This is "a" Test"'  
String out of IF Statement='"This is "a" Test"'  
String without Quotes=This is a Test  

Execute ("Supprimer Les Guillemets.cmd") sans aucun paramètre dans le Script 2:

sortie:

Welcome!

Press any key to continue . . .
1
répondu Mr. Rick 2011-12-09 16:25:36

j'ai créé ce petit script par lots basé sur les réponses ici, car il y en a beaucoup valables. N'hésitez pas à ajouter à cela du moment que vous suivez le même format:

REM Parameter-testing

Setlocal EnableDelayedExpansion EnableExtensions

IF NOT "%~1"=="" (echo Percent Tilde 1 failed with quotes) ELSE (echo SUCCESS)
IF NOT [%~1]==[] (echo Percent Tilde 1 failed with brackets) ELSE (echo SUCCESS)
IF NOT  "%1"=="" (echo Quotes one failed) ELSE (echo SUCCESS)
IF NOT [%1]==[] (echo Brackets one failed) ELSE (echo SUCCESS)
IF NOT "%1."=="." (echo Appended dot quotes one failed) ELSE (echo SUCCESS)
IF NOT [%1.]==[.] (echo Appended dot brackets one failed) ELSE (echo SUCCESS)

pause
1
répondu kayleeFrye_onDeck 2016-09-13 22:57:20

pour résumer:

set str=%~1
if not defined str ( echo Empty string )

ce code affichera" chaîne vide "si %1 est "" ou " ou vide. Ajouté à la réponse acceptée qui est actuellement incorrecte.

1
répondu GrayFace 2017-01-11 08:58:34

vous pouvez utiliser

if defined (variable) echo That's defined!
if not defined (variable) echo Nope. Undefined.
1
répondu noname 2017-04-26 00:53:04

j'ai eu beaucoup de problèmes avec beaucoup de réponses sur le net. La plupart travaillent pour la plupart des choses, mais il y a toujours une affaire qui casse chacune.

Peut-être que ça ne marche pas s'il y a des guillemets, peut-être que ça casse s'il n'y a pas de guillemets, erreur de syntaxe si le var a un espace, certaines ne fonctionneront que sur les paramètres (par opposition aux variables d'environnement), d'autres techniques permettent à un ensemble vide de guillemets de passer pour 'défini', et certaines plus délicates ne vous laisseront pas enchaîner un else par la suite.

Voici une solution qui me convient, s'il vous plaît, faites-moi savoir si vous trouvez un étui de coin qui ne fonctionnera pas.

:ifSet
if "%~1"=="" (Exit /B 1) else (Exit /B 0)

avoir ce sous-programme soit dans votre script , soit dans le sien .bat , devrait fonctionner.

Donc si vous voulez écrire (en pseudo):

if (var)
then something
else somethingElse

vous pouvez écrire:

(Call :ifSet %var% && (
    Echo something
)) || (
    Echo something else
)
1519290920 1519300920 1519170920 pour tous mes tests:

(Call :ifSet && ECHO y) || ECHO n
(Call :ifSet a && ECHO y) || ECHO n
(Call :ifSet "" && ECHO y) || ECHO n
(Call :ifSet "a" && ECHO y) || ECHO n
(Call :ifSet "a a" && ECHO y) || ECHO n

n , y , n , y , y


autres exemples:

  • vous voulez juste vérifier if ? Call :ifSet %var% && Echo set
  • Seulement si pas (seulement l'autre)? Call :ifSet %var% || Echo set
  • Vérification d'un argument passé; fonctionne très bien. Call :ifSet %1 && Echo set
  • N'a pas vous voulez bloquer votre code script / dupe, donc vous l'avez mis dans votre propre ifSet.bat ? Pas de problème: ((Call ifSet.bat %var%) && Echo set) || (Echo not set)
0
répondu Hashbrown 2016-08-03 10:56:52

à l'Aide ! au lieu de " pour une chaîne vide en cochant la case

@echo off
SET a=
SET b=Hello
IF !%a%! == !! echo String a is empty
IF !%b%! == !! echo String b is empty
0
répondu Lin W 2017-02-15 16:38:09

je l'ai tester avec le code ci-dessous et c'est parfait.

@echo off

set varEmpty=
if not "%varEmpty%"=="" (
    echo varEmpty is not empty
) else (
    echo varEmpty is empty
)
set varNotEmpty=hasValue
if not "%varNotEmpty%"=="" (
    echo varNotEmpty is not empty
) else (
    echo varNotEmpty is empty
)
0
répondu Kate 2018-03-06 15:28:20

j'y suis entré il y a un peu moins d'un mois (même si on me l'a demandé il y a 8 ans)... J'espère qu'il a dépassé les fichiers batch. ;-) J'ai utilisé pour ce faire tout le temps. Je ne suis pas sûr de ce que l'objectif ultime est, bien. S'il est paresseux comme moi, mon aller.chauve-souris fonctionne pour des trucs comme ça. (Voir ci-dessous) Mais, 1, la commande dans L'OP pourrait être invalide si vous utilisez directement l'input comme une commande. c'est à dire,

"C:/Users/Me"

est une commande invalide (ou était si vous étiez sur un autre lecteur). Vous avez besoin de le casser en deux parties.

C:
cd /Users/Me

et, 2, Que signifie "défini" ou "non défini"? GIGO. J'ai utiliser la valeur par défaut pour détecter les erreurs. Si l'input ne se fait pas attraper, il tombe à help (ou une commande par défaut). Donc, aucune entrée n'est pas une erreur. Vous pouvez essayer de cd à l'entrée et attraper l'erreur s'il y en a une. (Ok, en utilisant go "Téléchargements (un seul paren) est capturé par le DOS. (Sévère!))

cd "%1"
if %errorlevel% neq 0 goto :error

et, 3, les citations sont nécessaire seulement autour du chemin, pas la commande. c'est à dire,

"cd C:\Users" 

était mauvais (ou utilisé dans les vieux jours) à moins que vous étiez sur un autre lecteur.

cd "\Users" 

est fonctionnel.

cd "\Users\Dr Whos infinite storage space"

fonctionne si vous avez des espaces dans votre chemin.

@REM go.bat
@REM The @ sigh prevents echo on the current command
@REM The echo on/off turns on/off the echo command. Turn on for debugging
@REM You can't see this.
@echo off
if "help" == "%1" goto :help

if "c" == "%1" C:
if "c" == "%1" goto :done

if "d" == "%1" D:
if "d" == "%1" goto :done

if "home"=="%1" %homedrive%
if "home"=="%1" cd %homepath%
if "home"=="%1" if %errorlevel% neq 0 goto :error
if "home"=="%1" goto :done

if "docs" == "%1" goto :docs

@REM goto :help
echo Default command
cd %1
if %errorlevel% neq 0 goto :error
goto :done

:help
echo "Type go and a code for a location/directory
echo For example
echo go D
echo will change disks (D:)
echo go home
echo will change directories to the users home directory (%homepath%)
echo go pictures
echo will change directories to %homepath%\pictures
echo Notes
echo @ sigh prevents echo on the current command
echo The echo on/off turns on/off the echo command. Turn on for debugging
echo Paths (only) with folder names with spaces need to be inclosed in         quotes (not the ommand)
goto :done

:docs
echo executing "%homedrive%%homepath%\Documents"
%homedrive%
cd "%homepath%\Documents"\test error\
if %errorlevel% neq 0 goto :error
goto :done

:error
echo Error: Input (%1 %2 %3 %4 %5 %6 %7 %8 %9) or command is invalid
echo go help for help
goto :done

:done
0
répondu Xorange 2018-04-03 09:16:18