2010-09-06 12 views
4

J'ai un problème d'affectation de variables dans le script DOS pour la boucle. Il n'attribue jamais la valeur, c'est toujours vide. Ci-dessous l'exemple de codeProblème d'affectation de variable dans le fichier de commandes DOS pour la boucle

@echo off 
set ans=%1 
SET STRING=%ans:"=% 

echo Parsing the string "%STRING%": 
for /f "tokens=1-2" %%a in ("%STRING%") do (
set Word1 =%%a 
echo Word 1: %%a 
echo Word 1: %Word1% 
set Word2 =%%b 
if %%b.==. (Set server =\\.\pipe\mssql$microsoft##ssee\sql\query) else (Set server =%%b) 
) 
echo Server name "%server%" 
sqlcmd -s %server% 
valeur

de %% un n'est pas affecté à la variable Mot1. Mais quand je fais écho au %% a, il montre la valeur correcte. De même, dans la dernière valeur vide, vérifiez if condition, la variable du serveur n'a jamais été définie. Je suis très confus ici. Est-ce que quelqu'un peut m'aider??

P.S: entrée au script est une 2 chaîne de mots (ex: a.bat "l dev-server")

Répondre

11

Vous devez utiliser l'expansion retardée - !Word1! au lieu de %Word1%. Par défaut, lorsque le shell lit l'instruction pour la première fois, toutes les variables sont remplacées par leurs valeurs actuelles et l'instruction modifiée est utilisée à chaque fois que cette ligne est atteinte. C'est tout simplement le fonctionnement de DOS, qui est conservé dans le shell Windows pour une rétrocompatibilité.

L'expansion différée, d'autre part, réinsère la valeur chaque fois que l'instruction est atteinte. Cela vous donnera le résultat souhaité.

+4

Attention, comme expliqué dans cette page http://ss64.com/nt/setlocal.html, cette extension différée n'est pas activée par défaut. Pour l'activer, vous devez ajouter cette ligne dans votre script: SETLOCAL EnableDelayedExpansion –

+0

merci Diego pour plus d'informations. – Sven