2010-06-11 19 views
3

j'utilise set /p ci-dessous pour lire l'entrée de l'utilisateur il semble fonctionner en dehors du bloc if mais celui à l'intérieur si le bloc ne fonctionne pas. Lorsque je lance le script pour la deuxième fois, l'entrée utilisateur dans le bloc if imprime l'entrée utilisateur précédente.problème dans le script de lot lire l'entrée de l'utilisateur

script de test:

@echo off 
set cond=true 
echo %cond% 
if %cond%==true (
echo "cond is true" 
REM the below input doesn't work 
set /p name1="enter your name" 
echo name is: %name1% 
) 

REM it works here 
set /p name2="enter your name" 
echo name is: %name2% 

merci

Répondre

10

Lire sur l'expansion retardée help set.

Par défaut, les variables d'environnement (%foo%) sont développées lorsque cmd analyse une ligne. Et une ligne dans ce cas est une instruction unique qui peut inclure un bloc entre parenthèses complet. Ainsi, après l'analyse d'un bloc, toutes les occurrences de variables d'environnement sont remplacées par sa valeur au moment de l'analyse. Si vous modifiez une variable dans le bloc et que vous l'utilisez à nouveau, vous verrez l'ancienne valeur, simplement parce qu'elle a déjà été remplacée.

expansion retardée, ce qui peut être activé avec

setlocal enabledelayedexpansion 

les causes variables d'environnement marquées avec des points d'exclamation au lieu de signes de pourcentage (!foo!) à évaluer directement avant exécution une déclaration qui est après analyse syntaxique .

@echo off 
setlocal enabledelayedexpansion enableextensions 
set cond=true 
echo %cond% 
if %cond%==true (
echo "cond is true" 
REM the below input does work now 
set /p name1="enter your name" 
echo name is: !name1! 
) 
+0

Vous pouvez également démarrer 'CMD.EXE' en utilisant le commutateur'/V: ON'. – NealB

+0

@neal: Pour la plupart des fichiers batch, ce n'est pas une option viable. – Joey

+0

merci beaucoup ... c'est nouveau pour moi .. savez-vous suggérer une bonne ressource où je peux lire à ce sujet? – jch