Windows環境変数にURLプレフィックスを保存したい。ただし、クエリ文字列のアンパサンドにより、これは面倒です。
例:http://example.com?foo=1&bar=
というURLプレフィックスがあり、bar
パラメーターの値を指定して完全なURLを作成したい。次に、「開始」コマンドを使用してそのURLを起動します。
SET操作の値を引用符で囲むのは簡単です。
set myvar="http://example.com?foo=1&bar="
ただし、Windowsでは実際の値に引用符が含まれます(Windowsに感謝します)。
echo %myvar%
"http://example.com?foo=1&bar=true"
チルダを使用して、バッチファイルの引数から引用符を取り除くことができることを知っています。
echo %~1
ただし、名前付き変数に対しては実行できないようです。
echo %~myvar%
%~myvar%
これを達成するための構文は何ですか?
これは環境変数の制限ではなく、コマンドシェルの制限です。
割り当て全体を引用符で囲みます。
set "myvar=http://example.com?foo=1&bar="
ただし、これをエコーしようとすると、シェルが中断するので文句を言うでしょう。
Var名を引用符で囲むことにより、エコーできます。
echo "%myvar%"
または、setコマンドを使用して内容を表示するだけです。
set myvar
echo%myvar: "=%
これは動作します
for %a in (%myvar%) do set myvar=%~a
また、引用符なしでアンパサンドを含む変数を印刷する場合にもこれを使用します。
for %a in ("fish & chips") do echo %~a
すでにいくつかの良い答えがありますが、引用符を削除する別の方法は、単純なサブルーチンを使用することです:
:unquote
set %1=%~2
goto :EOF
完全な使用例は次のとおりです。
@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
遅延環境変数の展開を使用し、!var:〜1、-1!を使用します。引用符を削除するには:
@echo off
setlocal enabledelayedexpansion
set myvar="http://example.com?foo=1&bar="
set myvarWithoutQuotes=!myvar:~1,-1!
echo !myvarWithoutQuotes!
変数から開始と終了の引用符のみを削除するには:
SET myvar=###%myvar%###
SET myvar=%myvar:"###=%
SET myvar=%myvar:###"=%
SET myvar=%myvar:###=%
これは、値の中に### "または" ###がないことを前提とし、変数がNULLの場合は機能しません。
このメソッドのクレジットは http://ss64.com/nt/syntax-esc.html になります。
それを行うには、複数の変数を使用します。
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!
これは、変数に特殊なシェル文字が含まれているためです。