Rimuovere le virgolette dalle variabili di ambiente denominate negli script di Windows
-
08-07-2019 - |
Domanda
Voglio archiviare un prefisso URL in una variabile di ambiente Windows. Le e commerciali nella stringa di query rendono questo problema però.
Ad esempio: ho un prefisso URL http://example.com?foo=1&bar=
e desidero creare un URL completo fornendo un valore per la barra
. Vorrei quindi avviare quell'URL usando " start " comando.
L'aggiunta di virgolette attorno al valore per l'operazione SET è abbastanza semplice:
set myvar="http://example.com?foo=1&bar="
Windows include tuttavia le virgolette nel valore reale (grazie a Windows!):
echo %myvar%
"http://example.com?foo=1&bar=true"
So che posso rimuovere le virgolette dagli argomenti dei file batch usando tilde:
echo %~1
Tuttavia, non riesco a farlo con variabili nominate:
echo %~myvar%
%~myvar%
Qual è la sintassi per raggiungere questo obiettivo?
Soluzione
Questa non è una limitazione della variabile d'ambiente, ma piuttosto la shell dei comandi.
Racchiudi l'intero incarico tra virgolette:
set "myvar=http://example.com?foo=1&bar="
Anche se provi a fare eco, si lamenterà perché la shell vedrà una pausa lì dentro
Puoi echeggiarlo racchiudendo il nome var tra virgolette:
echo "%myvar%"
O meglio, basta usare il comando set per visualizzare i contenuti:
set myvar
Altri suggerimenti
echo% myvar: " =%
Funziona
for %a in (%myvar%) do set myvar=%~a
Lo userei anche se volessi stampare una variabile contenuta e commerciale senza virgolette.
for %a in ("fish & chips") do echo %~a
Mentre ci sono già diverse risposte valide, un altro modo per rimuovere le virgolette è usare una semplice subroutine:
:unquote
set %1=%~2
goto :EOF
Ecco un esempio di utilizzo completo:
@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
Usa l'espansione della variabile d'ambiente ritardata e usa! var: ~ 1, -1! per rimuovere le virgolette:
@echo off
setlocal enabledelayedexpansion
set myvar="http://example.com?foo=1&bar="
set myvarWithoutQuotes=!myvar:~1,-1!
echo !myvarWithoutQuotes!
Per rimuovere solo le virgolette iniziali e finali da una variabile:
SET myvar=###%myvar%###
SET myvar=%myvar:"###=%
SET myvar=%myvar:###"=%
SET myvar=%myvar:###=%
Questo presuppone che tu non abbia ### " o " ### all'interno del tuo valore e non funziona se la variabile è NULL.
Il credito va a http://ss64.com/nt/syntax-esc.html per questo metodo.
Usa più variabili per farlo:
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!
Questo perché la variabile contiene caratteri shell speciali.
Penso che questo dovrebbe farlo:
for /f "tokens=*" %i in (%myvar%) do set %myvar%=%~i
Ma non ti serve,
set myvar="http://example.com?foo=1&bar="
start "" %myvar%
Funzionerà anche tu, devi solo fornire un titolo al comando start.