web-dev-qa-db-ja.com

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

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

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

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

例、コマンドライン(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。

134
Peter Mortensen

cmdから:

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

例:

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の answer に基づく)
  • %は次のようにエスケープされます:%%(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
76

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

139
Wael Dalloul

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

この場合、ダミーの最初の引数を指定する必要があることに注意してください。startは、引用符で囲まれている場合、新しいコンソールウィンドウのタイトルとして最初の引数を扱います。したがって、次のように動作するはずです(そして、ここで動作します):

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

コマンド

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

シンプル。

12
Denis Howe

アンパサンドを含む文字列を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
1

Ifファイル名にスペースが含まれているandエスケープする必要がある文字がある:

単一および二重引用符を使用して、コマンド内の誤称を回避できます。

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

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

0
be-ns