69 votes

Vérifier la variable null dans le lot Windows

Je suis en train de travailler sur un Windows fichier batch qui va bcp trois fichiers texte dans SQL Server. Si quelque chose va mal dans la production, je veux être en mesure de remplacer les noms de fichier. Donc je pense que je vais faire quelque chose comme cela.

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

Je voudrais être en mesure de saisir des noms par défaut pour tous les trois fichiers, si les paramètres positionnels sont pas fournis. L'idée serait soit de les exécuter,

myjob.bat

sans paramètres, et d'utiliser les paramètres par défaut, ou à exécuter des

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

et avoir l'utilisation de ces fichiers. Je n'ai pas été en mesure de comprendre comment savoir si %1, %2 et %3 existent et/ou sont nulles. Aussi, je ne sais pas comment définir ces valeurs de façon conditionnelle. Est-ce possible? Toutes les suggestions seraient appréciées.

126voto

crb Points 4631

Pour vérifier l'existence d'un paramètre de ligne de commande, utilisez des crochets vides:

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

ou

 IF [%1] EQU [] echo Value Missing
 

La page SS64 sur IF vous aidera ici. Sous "% 1 existe-t-il?".

Vous ne pouvez pas définir de paramètre de position. Vous devez donc faire quelque chose comme:

 SET MYVAR=%1
 

Vous pouvez ensuite réinitialiser MYVAR en fonction de son contenu.

29voto

Leonardo Puglia Points 131

La bonne chose serait d'utiliser une instruction "si défini", qui est utilisée pour tester l'existence d'une variable. Par exemple:

 IF DEFINED somevariable echo Value exists
 

Dans ce cas particulier, la forme négative doit être utilisée:

 IF NOT DEFINED somevariable echo Value missing
 

PS: le nom de la variable doit être utilisé sans les caractères "%".

28voto

LarryF Points 2761

Les deux réponses sont correctes, mais je fais le mien est un peu différent. Vous pourriez envisager un couple de choses...

Démarrer le lot avec:

SetLocal

et à la fin il avec

EndLocal

Cela vous permettra de garder tous vos Ensembles" pour être valide uniquement pendant la session en cours, et ne laissera pas de vars la gauche autour nommé comme "Fichier1" ou toutes les autres variables que vous définissez lors de la course, qui pourrait interférer avec la prochaine exécution du fichier de commandes. Ainsi, vous pouvez faire quelque chose comme:

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

L'autre truc, c'est si vous avez seulement 1 ou 2 paramètres, utilisez le levier de commande pour se déplacer, donc la personne que vous cherchez est TOUJOURS à %1...

Par exemple, le premier paramètre de décalage, puis le faire à nouveau. De cette façon, vous n'êtes pas coder en dur %1, %2, %3, etc...

Windows processeur de traitement par lot est beaucoup plus puissant que ce que les gens lui donnent le crédit pour.. j'ai fait un truc de dingue, y compris le calcul de la date d'hier, même sur le mois et l'année limites, y compris les années Bissextiles, et de la localisation, etc.

Si vous voulez vraiment faire preuve de créativité, vous pouvez appeler des fonctions dans le traitement par lot... Mais c'est vraiment pour une autre discussion... :)

Oh, et ne pas le nom de vos fichiers batch .chauve-souris soit.. Ils sont .cmd's maintenant.. heh..

Espérons que cette aide.

13voto

Stanislav Kniazev Points 2587
 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%
 

Soyez prudent avec les caractères de citation, vous pouvez ou non en avoir besoin dans vos variables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X