Supprimer les guillemets des variables d'environnement nommées dans les scripts Windows
-
08-07-2019 - |
Question
Je souhaite stocker un préfixe d'URL dans une variable d'environnement Windows. Les esperluettes dans la chaîne de requête compliquent cette tâche.
Par exemple: j'ai un préfixe d'URL http://example.com?foo=1&bar=
et je souhaite créer une URL complète en fournissant une valeur pour la barre . paramètre
. Je souhaite ensuite lancer cette URL à l'aide de l'option & start; start " commande.
Ajouter des guillemets autour de la valeur de l'opération SET est assez simple:
set myvar="http://example.com?foo=1&bar="
Windows inclut les guillemets dans la valeur réelle cependant (merci Windows!):
echo %myvar%
"http://example.com?foo=1&bar=true"
Je sais que je peux enlever les guillemets des arguments de fichier de commandes en utilisant le tilde:
echo %~1
Cependant, je n'arrive pas à le faire avec des variables nommées:
echo %~myvar%
%~myvar%
Quelle est la syntaxe pour accomplir cela?
La solution
Ceci n'est pas une limitation de la variable d'environnement, mais plutôt du shell de commande.
Mettez l'intégralité de l'affectation entre guillemets:
set "myvar=http://example.com?foo=1&bar="
Bien que si vous essayez de faire écho à cela, il va se plaindre car le shell va voir une pause là-bas.
Vous pouvez y accéder en mettant le nom de la variable entre guillemets:
echo "%myvar%"
Ou mieux, utilisez simplement la commande set pour afficher le contenu:
set myvar
Autres conseils
echo% myvar: " =%
Cela fonctionne
for %a in (%myvar%) do set myvar=%~a
Je l’utiliserais aussi si je voulais imprimer une variable qui contenait et une esperluette sans les guillemets.
for %a in ("fish & chips") do echo %~a
Bien qu'il existe déjà plusieurs bonnes réponses, un autre moyen de supprimer les guillemets consiste à utiliser un simple sous-programme:
:unquote
set %1=%~2
goto :EOF
Voici un exemple d'utilisation complet:
@echo off
setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
set words="Two words"
call :unquote words %words%
echo %words%
set quoted="Now is the time"
call :unquote unquoted %quoted%
echo %unquoted%
set word=NoQuoteTest
call :unquote word %word%
echo %word%
goto :EOF
:unquote
set %1=%~2
goto :EOF
Utilisez l’extension de la variable d’environnement différée et utilisez! var: ~ 1, -1! supprimer les guillemets:
@echo off
setlocal enabledelayedexpansion
set myvar="http://example.com?foo=1&bar="
set myvarWithoutQuotes=!myvar:~1,-1!
echo !myvarWithoutQuotes!
Pour supprimer uniquement les guillemets de début et de fin d'une variable:
SET myvar=###%myvar%###
SET myvar=%myvar:"###=%
SET myvar=%myvar:###"=%
SET myvar=%myvar:###=%
Cela suppose que vous n’avez pas de ### " ou "### dans votre valeur, et ne fonctionne pas si la variable est NULL.
Le crédit va à http://ss64.com/nt/syntax-esc.html pour cette méthode.
Utilisez plusieurs variables pour le faire:
set myvar="http://example.com?foo=1&bar="
set bar=true
set launch=%testvar:,-1%%bar%"
start iexplore %launch%
@echo off
set "myvar=http://example.com?foo=1&bar="
setlocal EnableDelayedExpansion
echo !myvar!
Cela est dû au fait que la variable contient des caractères de shell spéciaux.
Je pense que cela devrait le faire:
for /f "tokens=*" %i in (%myvar%) do set %myvar%=%~i
Mais vous n'en avez pas besoin,
set myvar="http://example.com?foo=1&bar="
start "" %myvar%
Cela fonctionnera aussi, il vous suffit de fournir un titre à la commande de démarrage.