J'ai besoin de tester si une variable est définie ou non. J'ai essayé plusieurs techniques , mais ils semblent échouer à chaque fois %1
est entouré par des guillemets 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 IF
types de syntaxe pris en charge . Donc, je ne vois pas de moyen de le faire.
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
windows
shell
batch-file
cmd
blak3r
la source
la source
if "%1" == "" GOTO MyLabel
ne tue pas fatalement l'exécution du script tant qu'il%1
a un nombre pair de guillemets doubles. Je vois qu'un nombre impair de guillemets doubles%1
tue l'exécution du script avec cette erreur:The syntax of the command is incorrect.
La solution ci-dessous qui utilise des crochets pour résoudre le problème a été marquée comme la bonne réponse mais elle ne semble pas faire mieux . Cette solution échoue également avec la même erreur lorsqu'il y%1
a un nombre impair de guillemets doubles.IF DEFINED
travailler uniquement sur des variables d'environnement au lieu de variables de script est un tel gaspillage de potentiel!Réponses:
Utilisez des crochets au lieu des guillemets:
Les parenthèses ne sont pas sécurisées : utilisez uniquement des crochets.
la source
&
dans%1
cassera la ligneif #%1#==##
ouif [%1]==[]
est bon tant qu'il n'y a pas d'espace dans l'argument, sinon vous obtiendrez une…was unexpected at this time
erreur."%~1"
est vraiment une meilleure approche, comme je l'ai mentionné dans ma réponse.==
. Utilisez plutôt sa réponse.it DOES NOT work with spaces
. Utilisez plutôt la réponse @jamesdlin.Vous pouvez utiliser:
pour supprimer l'ensemble extérieur de guillemets. En général, c'est une méthode plus fiable que l'utilisation de crochets car elle fonctionnera même si la variable contient des espaces.
la source
~
, vous supprimez les guillemets externes s'ils sont présents, puis vous les rajoutez manuellement (en ne garantissant qu'un seul ensemble). De plus, vous devez utiliser des guillemets si l'argument contient des espaces (j'ai appris cela à la dure lorsque ma version précédente de l'utilisation de#
crochets ou au lieu de guillemets provoquait une…was unexpected at this time
erreur avec les arguments avec des espaces .)""this string will crash the comparison""
. Double "" est la séquence d'échappement appropriée, et faire une substitution sur le double "" échouera si le la chaîne est vide"%~1"
.L'une des meilleures solutions semi est de copier
%1
dans une variable, puis d'utiliser une expansion retardée, comme retardExp. est toujours à l'abri de tout contenu.L'avantage de cela est que le traitement de param1 est absolument sûr.
Et le réglage de param1 fonctionnera dans de nombreux cas, comme
Mais il échoue toujours avec des contenus étranges comme
Pour pouvoir obtenir une réponse 100% correcte à l'existence
Il détecte si
%1
est vide, mais pour certains contenus, il ne peut pas récupérer le contenu.Cela peut également être utile pour faire la distinction entre un vide
%1
et un avec""
.Il utilise la capacité de la
CALL
commande à échouer sans abandonner le fichier de commandes.Si vous voulez être à 100% à l'épreuve des balles pour récupérer le contenu, vous pouvez lire Comment recevoir même les paramètres de ligne de commande les plus étranges?
la source
De IF /?:
la source
%1
et les autres. Les "variables définies à l'intérieur du fichier de commandes" sont en fait des variables d'environnement pendant l'exécution du fichier de commandes et vous pouvez les utiliserIF DEFINED
.Malheureusement, je n'ai pas assez de réputation pour commenter ou voter sur les réponses actuelles car j'ai dû écrire les miennes.
À l'origine, la question du PO parlait de "variable" plutôt que de "paramètre", ce qui est devenu très déroutant, d'autant plus qu'il s'agissait du lien numéro un dans Google pour rechercher comment tester les variables vides. Depuis ma réponse d'origine, Stephan a modifié la question d'origine pour utiliser la terminologie correcte, mais plutôt que de supprimer ma réponse, j'ai décidé de la laisser pour dissiper toute confusion, en particulier dans le cas où Google envoie encore des gens ici pour des variables:
% 1 N'EST PAS UN VARABLE! C'EST UN PARAMÈTRE DE LIGNE DE COMMANDE.
Distinction très importante. Un signe de pourcentage unique avec un nombre après qu'il se réfère à un paramètre de ligne de commande et non à une variable.
Les variables sont définies à l'aide de la commande set et sont rappelées à l'aide de signes à 2% - un avant et un après. Par exemple% myvar%
Pour tester une variable vide, vous utilisez la syntaxe "si non définie" (les commandes explicites pour les variables ne nécessitent aucun signe de pourcentage), par exemple:
(Si vous souhaitez tester les paramètres de ligne de commande, je vous recommande de vous référer à la réponse de jamesdlin.)
la source
if variable is empty
àif parameter is empty
. Je viens de le faire. (au risque d'invalider certaines des réponses, qui ont vérifié les variables au lieu des paramètres et sont donc invalides de toute façon, car elles n'ont pas répondu à la question)Utilisez "IF DEFINED variable command" pour tester la variable dans le fichier de commandes.
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)
la source
Je teste avec le code ci-dessous et c'est très bien.
la source
IF DEFINED var
pour une raisonJ'utilise habituellement ceci:
Si% 1 est vide, l'IF comparera "." à "." qui sera évalué à vrai.
la source
J'ai créé ce petit script batch basé sur les réponses ici, car il y en a beaucoup de valides. N'hésitez pas à ajouter à cela tant que vous suivez le même format:
la source
La chaîne vide est une paire de
double-quotes
/""
, nous pouvons simplement tester la longueur:puis testez 2 caractères contre
double-quotes
:Voici un script batch avec lequel vous pouvez jouer. Je pense qu'il attrape correctement la chaîne vide.
Ceci est juste un exemple, vous avez juste besoin de personnaliser 2 (ou 3?) Étapes ci-dessus en fonction de votre script.
Ce résultat du test de torture:
la source
""
une chaîne vide est une chaîne vide '' et en batch une variable vide est une variable non définie. Vous pouvez définir que pour vos arguments, les guillemets externes seront supprimés, mais la chaîne est toujours vide avec une longueur de 0""
sont également utilisés pour les chaînes vides, mais il est assez facile à utiliser%~1
pour supprimer les guillemets externes. il n'est pas nécessaire d'utiliser une solution aussi complexe"%~1"==""
qui échoueront avec un argument comme"Long File Name".txt
lequel est un argument valide. edit : Et ce n'est certainement pas complexe comme vous l'avez dit. Seulement 2 étapes ci-dessus pour le test, le reste est un exemple détaillé.Vous pouvez utiliser
la source
Script 1:
Entrée ("Remove Quotes.cmd" "Ceci est un test")
Sortie (il n'y en a pas,% 1 n'était PAS vide, vide ou NULL):
Exécutez ("Remove Quotes.cmd") sans aucun paramètre avec le script ci-dessus 1
Sortie (% 1 est vide, vide ou NULL):
Remarque: Si vous définissez une variable dans une
IF ( ) ELSE ( )
instruction, elle ne sera disponible pour DEFINED qu'après avoir quitté l'instruction "IF" (sauf si "Expansion de variable retardée" est activée; une fois activée, utilisez un point d'exclamation "!" À la place de la symbole de pourcentage "%"}.Par exemple:
Script 2:
Entrée ("Remove Quotes.cmd" "Ceci est un test")
Production:
Remarque: 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 Files> "Remove Quotes.cmd" "Ceci est" un "Test"
Sortie (Script 2):
Exécutez ("Remove Quotes.cmd") sans aucun paramètre dans le script 2:
Production:
la source
Pour résumer:
Ce code affichera "Chaîne vide" si% 1 est "" ou "ou vide. Ajouté à la réponse acceptée qui est actuellement incorrecte.
la source
J'ai eu beaucoup de problèmes avec beaucoup de réponses sur le net. La plupart fonctionnent pour la plupart des choses, mais il y a toujours un cas d'angle qui casse chacun.
Peut-être que cela ne fonctionne pas s'il a des guillemets, peut-être qu'il se casse s'il n'a pas de guillemets, une erreur de syntaxe si le var a un espace, certains ne fonctionneront que sur les paramètres (par opposition aux variables d'environnement), d'autres techniques permettent un vide ensemble de guillemets à passer comme «définis», et certains plus délicats ne vous laisseront pas enchaîner
else
par la suite.Voici une solution dont je suis satisfait, faites-le moi savoir si vous trouvez un cas d'angle pour lequel il ne fonctionnera pas.
Avoir ce sous-programme soit dans votre script, soit dans le sien
.bat
, devrait fonctionner.Donc si vous vouliez écrire (en pseudo):
Tu peux écrire:
Cela a fonctionné pour tous mes tests:
Echo'd
n
,y
,n
,y
,y
Plus d'exemples:
if
?Call :ifSet %var% && Echo set
Call :ifSet %var% || Echo set
Call :ifSet %1 && Echo set
ifSet.bat
? Aucun problème:((Call ifSet.bat %var%) && Echo set) || (Echo not set)
la source
(Call ifSet.bat YES && (Echo true & Echo x | findstr y)) || Echo
true
false
ifSet
lui-même, puis en utilisantIf %errorlevel% EQU 0 (x) Else (y)
set
variables (comme[%bob%]
, ne fonctionnant que pour des arguments comme[%2]
), mais maintenant, il vérifie à nouveau que cela fonctionne. Je suppose que mon seul reproche[]
est qu'il laisse passer les guillemets vides, alors que cela ne va pas (donc c'est à votre cas d'utilisation, vraiment)/B
drapeau empêche la sortie du lot entier, uniquement la sortie du sous-programme oucall
du lot. À moins que vous ne demandiez ce que fait toute la commande ; il renvoie un code d'erreur pour permettre au script appelant de connaître le résultat du sous-programme (0
réussite,1
échec), utilisable via une logique booléenne dans la réponse, ou via%errorlevel%
dans les commentaires ci-dessusEn utilisant ! au lieu de "pour la vérification de chaîne vide
la source
Je suis entré il y a un peu moins d'un mois (même si cela a été demandé il y a 8 ans) ... J'espère qu'il / elle a déjà dépassé les fichiers batch. ;-) J'avais l'habitude de faire ça tout le temps. Je ne sais pas quel est le but ultime, cependant. S'il est paresseux comme moi, mon go.bat fonctionne pour des trucs comme ça. (Voir ci-dessous) Mais, 1, la commande dans l'OP peut être invalide si vous utilisez directement l'entrée en tant que commande. c'est à dire,
est une commande non valide (ou utilisée si vous étiez sur un autre lecteur). Vous devez le casser en deux parties.
Et, 2, que signifie «défini» ou «non défini»? GIGO. J'utilise la valeur par défaut pour détecter les erreurs. Si l'entrée n'est pas interceptée, elle tombe pour aider (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, utiliser les téléchargements go "(un seul paren) est pris par DOS. (Dur!))
Et, 3, les guillemets sont nécessaires uniquement autour du chemin, pas de la commande. c'est à dire,
était mauvais (ou habitué autrefois), sauf si vous étiez sur un autre lecteur.
est fonctionnel.
fonctionne si vous avez des espaces sur votre chemin.
la source
cd
«/d
changer»:cd /d "C:\Users\Me" (and the proper path delimeter for Windows is
«non»/
).