2009-11-06 6 views
10

J'ai eu un problème avec set ne fonctionne pas dans un fichier batch; il a fallu du temps pour distiller le problème; au début, je pensais qu'il était de faire des appels de sous-programme ...DOS batch: SET variable et ECHO dans (0) bloc

Le script

@echo off 
setlocal 
set a=aaa 
echo a = "%a%" 
(
set b=bbb 
echo b = "%b%" 
) 

produit la sortie

a = "aaa" 
b = "" 

alors que je me attends

a = "aaa" 
b = "bbb" 

Pourquoi est-ce s'il te plait? Est-ce un bug dans DOS? Il y a peut-être quelque chose à propos de la syntaxe de groupement de commandes (...) que je ne connais pas.

Merci.

Répondre

10

Expansion retardée par l'utilisateur et! au lieu de%

@echo off 
setlocal enableextensions enabledelayedexpansion 
set a=aaa 
echo a = "%a%" 
(
set b=bbb 
echo b = "!b!" 
) 
+0

Merci pour la réponse concise. Savez-vous s'il existe une syntaxe pour les paramètres numérotés% 1, etc.? J'ai essayé! 1 et! 1 !, mais ceux-ci ne fonctionnent pas. (Je pose cette question dans le contexte d'un appel de sous-programme.) – Rhubbarb

+1

Puisqu'ils ne peuvent pas changer entre l'analyse et l'exécution de la façon dont les variables de type% a% peuvent, je ne vois pas que c'est important. –

+0

Vous avez raison. J'ai eu d'autres problèmes avec le script qui a ensuite présenté les mêmes symptômes. Problème résolu. Merci beaucoup (à tous). – Rhubbarb

6

L'extension différée doit être activée ou l'interpréteur de lots interpolera toutes les variables au moment de l'analyse, au lieu de l'exécution.

setlocal enableextensions enabledelayedexpansion 

Voir this question un exemple et une grande explication.

7

Ce qui se passe est que l'interpréteur par lots traite tout ce qui se trouve entre les parenthèses sur une seule ligne. Cela signifie qu'il effectue un remplacement variable sur tout ce qui se trouve entre les parenthèses avant que l'une des commandes ne soit exécutée.

Alors:

(
set b=bbb 
echo b = "%b%" 
) 

Devient:

(
set b=bbb 
echo b = "" 
) 

La variable b est fixée, mais est évidemment pas mis en avant d'exécuter la commande SET.