web-dev-qa-db-fra.com

Supprimer les guillemets des variables d'environnement nommées dans les scripts Windows

Je souhaite stocker un préfixe d'URL dans une variable d'environnement Windows. L'esperluette dans la chaîne de requête rend cependant cela gênant.

Par exemple: j'ai un préfixe d'URL de http://example.com?foo=1&bar= et souhaitez créer une URL complète en fournissant une valeur pour le paramètre bar. Je veux ensuite lancer cette URL en utilisant la commande "start".

L'ajout de 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 (merci Windows!):

echo %myvar%
"http://example.com?foo=1&bar=true"

Je sais que je peux supprimer les guillemets des arguments du fichier batch en utilisant tilde:

echo %~1

Cependant, je n'arrive pas à le faire pour les variables nommées:

echo %~myvar%
%~myvar%

Quelle est la syntaxe pour accomplir cela?

54
Craig Walker

Il ne s'agit pas d'une limitation de la variable d'environnement, mais plutôt de la commande Shell.

Joignez l'intégralité du devoir entre guillemets:

set "myvar=http://example.com?foo=1&bar="

Bien que si vous essayez de faire écho à cela, cela se plaindra car le Shell verra une pause là-dedans.

Vous pouvez l'écho en mettant le nom var entre guillemets:

echo "%myvar%"

Ou mieux, utilisez simplement la commande set pour afficher le contenu:

set myvar
31
zdan

echo% myvar: "=%

37
ben

Cela marche

for %a in (%myvar%) do set myvar=%~a

J'utiliserais également ceci si je voulais imprimer une variable qui contenait et esperluette sans les guillemets.

for %a in ("fish & chips") do echo %~a
9
Chris

Bien qu'il existe déjà plusieurs bonnes réponses, une autre façon de supprimer les guillemets consiste à utiliser un sous-programme simple:

: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
9
jimhark

Utilisez l'expansion des variables d'environnement différées et utilisez! Var: ~ 1, -1! pour supprimer les guillemets:

@echo off
setlocal enabledelayedexpansion
set myvar="http://example.com?foo=1&bar="
set myvarWithoutQuotes=!myvar:~1,-1!
echo !myvarWithoutQuotes!
2

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" ### à l'intérieur de votre valeur, et ne fonctionne pas si la variable est NULL.

Le crédit revient à http://ss64.com/nt/syntax-esc.html pour cette méthode.

2
Keith

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%
1
CmdCrazy
@echo off
set "myvar=http://example.com?foo=1&bar="
setlocal EnableDelayedExpansion
echo !myvar!

En effet, la variable contient des caractères Shell spéciaux.

0
Amr Ali