2010-04-12 10 views
4

Dans ma recherche d'une solution à un autre problème lié à l'environnement et aux fichiers batch, j'ai de nouveau rencontré un problème que j'ai déjà rencontré (mais pas pour de moi me souviens comment, ou même si je l'ai résolu).Comment utiliser une variable d'environnement comme environnement Nom de la variable

Disons que vous avez deux fichiers BAT (ou un fichier batch et la ligne de commande). Comment peut-on passer un nom de variable d'environnement à l'autre pour qu'il puisse lire la variable? L'exemple suivant ne fonctionne pas:

A.BAT: 
    @call b.bat path 

B.BAT: 
    @echo %%1% 

> A.BAT 
> %1 
> B.BAT path 
> %1 

Il est assez facile de passer l'environnement nom de la variable, mais ne peut le sembler appelé à l'utiliser. (Je ne me souviens pas si ou comment j'ai traité cela la dernière fois, mais j'imagine que cela nécessitait l'utilisation moins qu'idéale de rediriger des fichiers BAT temporaires et de les appeler ainsi.)

? Merci.

Répondre

4

Vous pouvez utiliser une petite astuce qui est nulle part documenté malheureusement:

call echo %%%1%% 

Ensuite, vous pouvez utiliser l'expansion retardée :

setlocal enabledelayedexpansion 
echo !%1! 

L'expansion différée aide ici principalement car elle utilise d'autres délimiteurs pour la variable et les évalue directement avant pour exécuter la commande, alors que normalement l'évaluation peut entrer en conflit avec l'expansion normale des paramètres.

Une autre façon de ce faire trop serait un sous-programme:

call :meh "echo %%%1%%" 

... 

:meh 
%~1 
goto :eof 

Tous les exemples, y compris l'autre réponse, ont une chose en commun ici: Ils ont tous la force cmd pour évaluer les variables/paramètres deux fois . Cela ne fonctionnera pas autrement, puisque la première évaluation doit produire %VariableName%, tandis que la seconde l'étendra au contenu de la variable.

Vous pouvez trouver le code également sur my SVN.

+0

Ah, j'avais oublié de enabledelayedexpansion. J'essayais de me concentrer davantage sur les trucs old school puisque nous ne connaissons pas l'exigence de version. – Anders

+0

Nice, les deux méthodes fonctionnent. En fait, vous m'avez donné une idée d'un moyen qui pourrait, espérons-le, fonctionner même en mode DOS. Je vais le tester maintenant. – Synetech

+0

@Syn: Avez-vous * besoin * de cela sous DOS? Je n'ai pas eu à toucher au DOS depuis quelques années maintenant et je doute que de nombreuses solutions doivent encore fonctionner. – Joey

2

B.BAT:

FOR /F "delims=" %%a IN ('echo.%%%1%%') DO set inputvar=%%a 
echo %inputvar% 

C'est une façon de le faire.

Si tout ce que vous voulez faire est l'écho, vous pouvez faire: echo.%%%1%%|more ou echo %%%1%%|find /v ""

+0

J'ai essayé cela, mais tout ce qu'il fait est d'imprimer un double pourcentage: '%%'. – Synetech

+0

Qu'est-ce que l'impression en %%? Version Windows? FOR/F ne fonctionnera que sur NT (2000?) – Anders

+0

'for/f' est disponible depuis Windows NT 4. De plus, cette méthode échoue avec des espaces dans le contenu de la variable. J'ai pris la liberté de l'éditer pour fonctionner correctement. – Joey

Questions connexes