web-dev-qa-db-ja.com

Windowsスクリプトの名前付き環境変数から引用符を削除する

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%

これを達成するための構文は何ですか?

54
Craig Walker

これは環境変数の制限ではなく、コマンドシェルの制限です。

割り当て全体を引用符で囲みます。

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

ただし、これをエコーし​​ようとすると、シェルが中断するので文句を言うでしょう。

Var名を引用符で囲むことにより、エコーできます。

echo "%myvar%"

または、setコマンドを使用して内容を表示するだけです。

set myvar
31
zdan

echo%myvar: "=%

37
ben

これは動作します

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

また、引用符なしでアンパサンドを含む変数を印刷する場合にもこれを使用します。

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

すでにいくつかの良い答えがありますが、引用符を削除する別の方法は、単純なサブルーチンを使用することです:

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

遅延環境変数の展開を使用し、!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 になります。

2
Keith

それを行うには、複数の変数を使用します。

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!

これは、変数に特殊なシェル文字が含まれているためです。

0
Amr Ali