Les variables de lot Windows ne sont pas définies

Je pense que j’ai rencontré un bogue dans les scripts par lot de Windows.

Je ne peux pas définir de variables dans une instruction if élargie.

Voici une partie isolée de mon script:

@echo off set success=1 set Version=12345 set Target=Client set Type=456 set dir= set zip= if "%Version%"=="" set success=0 if "%Type%"=="" set success=0 if 1==1 set test=42 if %success%==1 ( set test2=57005 if "%Target%"=="Client" ( set dir=ModName v%Version% set zip=ModName v%Version% %Type%.zip echo Version: %Version% echo Type: %Type% echo. echo Target: %Target% echo dir: %dir% echo zip: %zip% echo. echo test: %test% echo test2: %test2% ) ) else ( echo Not successful. ) 

Ceci est la sortie d’une nouvelle instance de cmd:

 C:\Users\RandomClown\Desktop>test.bat Version: 12345 Type: 456 Target: Client dir: zip: test: 42 test2: 

Ce que vous devez noter, c’est que la ligne simple si l’instruction définit correctement les choses. La multiligne exécutera tout ce qui n’est PAS un ensemble. Je ne pense pas avoir manqué quelque chose. En outre, l’instruction multiline if exécute correctement les bonnes lignes, car les lignes else ( echo Not successful. ) N’ont pas été exécutées.

Pourquoi les lignes n’ont-elles pas été exécutées?

Tu as manqué quelque chose 😉

cmd développe les variables lorsque les commandes sont analysées , pas lorsqu’elles sont exécutées. Il se trouve qu’une instruction if ou for avec un bloc ( ... ) (ou en fait un bloc quelconque) désigne une seule commande dans ce cas. Donc, lorsque vous définissez des variables dans un bloc et essayez de les utiliser dans le même bloc, il n’y a plus de variables – elles ont été remplacées par les valeurs des variables avant l’exécution du bloc.

Coller un

 setlocal enabledelayedexpansion 

au début de votre fichier batch et utilisez !zip! au lieu de %zip% . Voir l’ help set pour une discussion détaillée du problème.

Juste un rappel, la commande ms-dos “set” prend chaque chaîne après le signe égal. Donc, si vous écrivez

 if "x"=="x" set a=foo else set a=bar echo %a% // output : foo else set a=bar 

Le% a% est en fait défini sur “foo else set a = bar”, pas foo. Donc, j’utilise toujours “()” pour la commande set s’il y a plusieurs commandes dans une ligne.

 if "%1"=="" (set a=20) else (set a=%1)