9
votes

Dans cmd.exe, comment pouvez-vous obtenir une variable pour échapper à la commande setLocal?

Je me trouve fréquemment en utilisant setlocal dans cmd.exe pour éviter de polluer l'espace variable d'environnement avec des variables temporaires (et pour vous assurer que les extensions de commande et l'expansion retardée sont actives) .

Cependant, je suis une perte sur la façon de faire cela si je veux réellement que l'une de ces variables soit disponible.

Considérez le code suivant qui vous donne le composant final du courant répertoire (donc c: \ pax \ dir1 vous donnerait dir1 ): xxx

quand je cours ça, je Obtenez la sortie: xxx

et vous pouvez voir que le dossier %% variable ne survit pas au endlocal . Toutefois, si je laissez désactiver le setlocal / endlocal de la fonction, le TEMP flowable pollue l'espace de noms de principal

Je sais que je peux simplement utiliser définir temp = à la fin de FUNC et cela supprimera la variable d'environnement mais qui ne couvre pas le cas où je suis déjà utilisé. cette variable dans la portée extérieure (elle est totalement détruite dans ce cas).

existe une manière dans cmd.exe pour permettre à un groupe de variables d'environnement sélectionnant à la périmètre extérieur tout en empêchant toujours les autres de l'affecter? En d'autres termes, pouvez-vous avoir à la fois des variables locales et des variables de retour?


Misté, ne me dites pas qu'il y a une meilleure façon d'obtenir la composante de chemin finale. C'est un exemple d'exemple uniquement.

En réalité, vous peux me dire un meilleur moyen car ce serait bien de savoir, mais cela ne répondra pas à ma question spécifique: - )


0 commentaires

3 Réponses :


12
votes

"La solution est de tirer profit du fait que le shell CMD évalue les variables sur une base ligne par ligne - plaçant ainsi ENDLOCAL sur la même ligne que l'instruction SET (s) donne le résultat que nous voulons: "source: ss64.com

Ainsi, le changement de endlocal func: à ce sujet. .. p>

endlocal & set folder=%folder%


4 commentaires

Avec peut-être un peu plus entre parenthèses jeté dedans?


@Ben Pas à ma connaissance. Le ampersand, tel qu'utilisé, est un séparateur de commande pas un opérateur. Non pas que l'aide entre parenthèses blesserait, donc si vous préféreriez ne hésitez pas.


Brillant. Fonctionne parfaitement, y compris plusieurs && ensemble commandes pour permettre à plus d'une variable d'échapper.


Désolé, je voulais dire entre guillemets, pas entre parenthèses.



3
votes

Pour une meilleure lecture et mise en forme, vous pouvez utiliser des parenthèses.

call :func resultVar
echo(%resultVar%
goto :eof

:func 
setlocal
set var=2
(
  endlocal
  if "%1" NEQ "" set "%1=%var%"
  goto :eof
)


0 commentaires

0
votes

endlocal && ensemble aaa aaa =% &&% set = bbb bbb%% permanantly ensembles aaa et bbb en dehors du setlocal et conserve ce paramètre dans l'invite de commande pour un autre fichier batch à utiliser (pour exmaple, si le fichier batch contenant le setlocal a été appelé à partir d'un autre fichier batch le fichier batch appelant aura maintenant les nouveaux paramètres aaa et bbb

Merci à celui qui a expliqué à propos de endlocal && ensemble . Je suis passé par trente-six sites Web pour obtenir une résolution à cette situation simple.


0 commentaires