web-dev-qa-db-fra.com

Vérifier la variable null dans le lot Windows

Je travaille sur un fichier de commandes Windows qui bcp trois fichiers texte dans SQL Server. Si quelque chose ne va pas en production, je veux pouvoir remplacer les noms de fichiers. Donc, je pense à faire quelque chose comme ça.

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

J'aimerais pouvoir entrer des noms par défaut pour les trois fichiers, à utiliser si les paramètres de position ne sont pas fournis. L'idée serait soit d'exécuter

myjob.bat

sans paramètres, et le faire utiliser les valeurs par défaut, ou exécuter

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

et le faire utiliser ces fichiers. Je n'ai pas été en mesure de déterminer comment déterminer si% 1,% 2 et% 3 existent et/ou sont nuls. Je ne sais pas non plus comment définir ces valeurs de manière conditionnelle. Est-ce possible? Toute suggestion serait appréciée.

66
John M Gant

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.

122
crb

Les deux réponses données sont correctes, mais la mienne est un peu différente. Vous voudrez peut-être envisager quelques choses ...

Commencez le lot avec:

SetLocal

et terminer avec

EndLocal

Ceci gardera tous vos 'SETs' pour être seulement valide pendant la session en cours, et ne laissera pas de vars nommés comme "FileName1" ou toute autre variable que vous avez définie pendant l'exécution, qui pourrait interférer avec la prochaine exécution du fichier de commandes. Donc, vous pouvez faire quelque chose comme:

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

L’autre astuce consiste à ne déplacer que 1 ou 2 paramètres et à utiliser la commande SHIFT pour les déplacer. Ainsi, celui que vous recherchez est TOUJOURS à% 1 ...

Par exemple, traitez le premier paramètre, décalez-le, puis recommencez. De cette façon, vous ne coderez pas en dur% 1,% 2,% 3, etc ...

Le traitement par lots de Windows est beaucoup plus puissant que les utilisateurs ne le reconnaissent .. J'ai fait quelques trucs fous avec, y compris le calcul de la date d'hier, même au-delà des mois et des années, y compris l'année bissextile, 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 discussion différente ... :)

Oh, et ne nommez pas vos fichiers batch . Bat non plus .. Ils sont . Cmd maintenant .. heh ..

J'espère que cela t'aides.

28
LarryF

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 "%".

28
Leonardo Puglia
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.

13