バッチファイルでアンパサンドをエスケープするにはどうすればよいですか?


146

コマンドを使用startしてURLにアンパサンドを含むWebページを開くために、バッチファイルで(またはWindowsコマンドラインから)アンパサンドをエスケープするにはどうすればよいですか?

二重引用符は、では機能しませんstart。代わりに、新しいコマンドラインウィンドウが開始されます。

更新1:Wael Dalloulのソリューションが機能します。さらに、URLエンコードされた文字(スペースが%20としてエンコードされているなど)がURLにあり、それがバッチファイル内にある場合、 '%'は '%%'としてエンコードする必要があります。これは、例には当てはまりません。

例、コマンドライン(CMD.EXE)から:

start http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8

結果になります

http://www.google.com/search?client=opera 

デフォルトのブラウザで開かれ、コマンドラインウィンドウでこれらのエラー:

'rls' is not recognized as an internal or external command,
operable program or batch file.
'q' is not recognized as an internal or external command,
operable program or batch file.
'sourceid' is not recognized as an internal or external command,
operable program or batch file.
'ie' is not recognized as an internal or external command,
operable program or batch file.
'oe' is not recognized as an internal or external command,
operable program or batch file.

プラットフォーム:Windows XP 64ビットSP2。


1
私はベルガボブの答えを編集したので、今はうまくいくはずです。これは単なる癖でstartあり、考えずに適用すると、引数の引用が失敗します。全体として、引数を引用符で囲む方が、エスケープする必要のあるすべての文字をエスケープするよりも簡単でエラーが発生しにくいと思います。
ジョーイ

プラス記号は+どうしたらいいですか?
ウィリアム

PowerShellでは引用符が削除されるstart "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"ため、PowerShellで機能します
phuclv 2017年

回答:


91

cmdから

  • &これは次のようにエスケープされます:^&(@Wael Dalloulの回答に基づく)
  • % エスケープする必要はありません

例:

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%20and%20percentage+in+cmd^&sourceid=opera^&ie=utf-8^&oe=utf-8

バッチファイルから

  • &これは次のようにエスケープされます:^&(@Wael Dalloulの回答に基づく)
  • %これは次のようにエスケープされます:%%(OPの更新に基づく)

例:

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%%20and%%20percentage+in+batch+file^&sourceid=opera^&ie=utf-8^&oe=utf-8

「%」のエスケープの例を含めることもできます-次に、質問を整理できます。
Peter Mortensen、2015年

@PeterMortensen間違いなく-私は私の答えを更新しました。
Lasse Christiansen

2
どのキャラクターもエスケープする必要がありますか?「|」をエスケープする必要があることに気付きました 「^ |」による。
2015年

この場合、環境変数として%定義するのは愚かなので、エスケープする必要はありません20andか?もしそうなら、代わりにstart http://www.google.com/search?q=ampersand%20and%20percentageリンクすることができますhttp://www.google.com/search?q=ampersandsomething-silly20percentage^%例をcmdでエスケープするために使用すると、期待どおりに動作します。
TamaMcGlinn

145

&コマンドを区切るために使用されます。したがって^、をエスケープするために使用できます&


3
プラス記号は+どうしたらいいですか?
ウィリアム

これは、より一般的な適用可能なソリューションです。コマンドラインプログラムのパラメータに1つ以上のアンパサンドが含まれている場合にも機能します。私はこれに遭遇しました-パラメータはCGW5COMM&10C4&8301でした。
Peter Mortensen

アンパサンドをキャレット文字^でクォートしても、すべての状況で機能するとは限りません。たとえば、アンパサンド付きのパスワードを渡すために/ p:スイッチを指定してmsdeploy.exeを実行しようとしても、私が試した順列(キャレット引用符、二重引用符、ダミーの最初の引数)では機能しないようです。
デレクグリア2014

3
使用例は^非常に貴重です。
jpmc26 2015年

2
@ jpmc26 この回答に例を追加しました。
Lasse Christiansen

29

ダミーの最初の引数を指定する場合は、引用符で囲むことができます。

この場合、start最初の引数を引用すると、新しいコンソールウィンドウのタイトルとして扱われるため、ダミーの最初の引数を指定する必要があることに注意してください。したがって、以下は機能するはずです(ここでも機能します)。

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"

はい、タイトルが内部の質問と完全に一致していないことを認めます。(タイトルを長くする必要があると思いますか?)
ピーターモーテンセン

結局のところ、「ドー」ではない-引用符で囲むのが正しい考えだった-コンソールウィンドウのタイトルについては知らなかった。ヨハネス、ありがとう!
ベルガボブ2009

PowerShellは引数から引用符を削除するため、これは失敗します。start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"PowerShellでのみ使用する必要があります
phuclv '19年


12

コマンド

echo this ^& that

期待どおりに動作し、出力

this & that

コマンド

echo this ^& that > tmp

文字列をファイル「tmp」に書き込むこともできます。ただし、パイプの前

echo this ^& that | clip

^の解釈は完全に異なります。2つのコマンド「echo this」と「that」の出力をパイプに書き込もうとします。エコーは機能し、「それ」はエラーになります。言う

echo this ^& echo that | clip

文字列「this」と「that」をクリップボードに置きます。

^なし:

echo this & echo that | clip

最初のエコーはコンソールに書き込まれ、2番目のエコーの出力のみがパイプでクリップにクリップされます(> tmpリダイレクトの場合と同様)。したがって、出力がリダイレクトされるとき、^は&を引用せずに、リダイレクト後ではなくリダイレ​​クト前に適用されるようにします。

&をパイプするには、2回引用する必要があります

echo this ^^^& that | clip

文字列を変数に入れると

set m=this ^& that

その後

set m

出力されます

m=this & that

しかし明白な

echo %m%

Windowsが変数を置き換えた後、

echo this & that

これを新しいコマンドとして解析し、「それ」を実行しようとします。

バッチファイルでは、遅延展開を使用できます。

setlocal enableDelayedExpansion
echo !m!

パイプに出力するには、変数値のすべての&を^&で置き換える必要があります。これは、%VAR:FROM = TO%構文で実行できます。

echo !m:^&=^^^&! | clip

コマンドラインで「cmd / v」を使用すると、拡張の遅延が有効になります。

cmd /v /c echo !m!

これはパイプに書き込んでも機能します

cmd /v /c echo !m! | clip

シンプル。


パイプのソリューションは機能しますが、結論は多かれ少なかれ間違っています。ところで シンプルなecho this ^^^& that | clip作品も。マジックパイプの処理を理解するには、「SO:パイプされたコードブロック内で遅延拡張が失敗するのはなぜですか?」
2016

1

echoアンパサンドを含む文字列が必要な場合、引用符は出力にも表示されるため、役に立ちません。このような場合は、次を使用しますfor

for %a in ("First & Last") do echo %~a

...バッチスクリプト:

for %%a in ("First & Last") do echo %%~a

または

for %%a in ("%~1") do echo %%~a

0

場合は、ファイルの名前にスペースを持っているあなたは文字を持っているあなたは、エスケープする必要があります。

コマンド内の誤称を避けるために、単一引用符と二重引用符を使用できます。

scp ./'files name with spaces/internal folder with spaces/"text & files stored.txt"' .

^文字は、それ以外の場合は、引用符をエスケープします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.