2

Windowsで実行する簡単なスクリプトをバッチで作成しようとしていますが、スクリプトには3つの変数があります。

  1. 開くURL
  2. 開くウィンドウの数
  3. 新しいウィンドウが開くまで待つ時間

URLに%20や%2Fなどの文字が含まれていて、cmd.exeがそれらを変数として使用しようとしている場合を除いて、スクリプトは正常に機能します。URLの値を引用符で囲んでいますが、それは役に立ちませんでした。

アドレスを使用する場合:

set url="http://domain.com/app.html?path=%2F%2Flocalhost%2Fcode&do_pause=false&go=true"

ブラウザはこれを開きます:

https://domain.com/app.html?path=FFlocalhostFcode&do_pause=false&go=true

これらのシンボルを変数名として解釈しないように、変数を設定したり、その値を処理したりする方法はありますか?

よろしくお願いします。参照用のコードは次のとおりです。スクリプトをバッチでプログラムするのは初めてなので、どんな提案でも大歓迎です。

@echo off

echo "Setting variables..."
set iterations=2
set url="http://domain.com/app.html?path=%2F%2Flocalhost%2Fcode&do_pause=false&go=true"
set time=5

set browser="C:\Program Files\Google\Chrome\Application\chrome.exe"

echo "Running the browser..."
FOR /L %%i IN (1,1,%iterations%) DO (
%browser% %url%
timeout %time%
)

ECHO Browsers are running, press Enter when ready to close this window. . .
pause
4

2 に答える 2

6

試す:

set url="http://domain.com/app.html?path=%%2F%%2Flocalhost%%2Fcode&do_pause=false&go=true"

バッチファイルでは、%1、%2などがコマンドラインパラメータに使用されるため、%の代わりに%%が必要です。

于 2012-10-16T19:00:19.337 に答える
2

完全にはわかりませんが、ずっと前のことです。これを試してください:

set url="http://domain.com/app.html?path=^%2F^%2Flocalhost^%2Fcode&do_pause=false&go=true"

さて、ついに私はカレット(^)のエスケープについてどこで得たのか、そしてカレットで何をエスケープすべきかを見つけました:

第4に、二重引用符で囲まれていないすべての予約済みシェル文字はエスケープする必要があります。これらの文字は、WindowsNTコマンドシェルにとって特別な意味を持っています。予約されているシェル文字は次のとおりです。

&| ()<> ^

コマンドの引数の一部として予約済みシェル文字を渡すには、引数全体を二重引用符で囲むか、予約済み文字をエスケープする必要があります。予約文字の前にカラット(^)文字を付けてエスケープします。たとえば、次のコマンド例は、<と>が予約済みのシェル文字であるため、期待どおりに機能しません。

ソース(http://technet.microsoft.com/en-us/library/cc723564.aspx)は、1つのドキュメントに収集されたCMDスクリプティングで明確に定義されていないものについての良い読み物であるようです。ただし、「%」の引用符については説明していません。それにもかかわらず、私はその事件について言及している%%が、一般的な文脈ではない場所を1つ見つけました。

Use of CALL to expand a line a second time.
set var=one
(
  set var=two
  echo %var%
  call echo %%var%%
)

Only the second call echo will output two, as the parser will first parse the 
line when parsing the block to call echo %var%, as doubled percents are reduced
to one.

ソース:http ://technet.microsoft.com/en-us/library/cc732835(v = ws.10).aspx

ただし、公式の コマンドラインリファレンス全体には、「次のように見える」という言葉がたくさんあります。

Reparsing of parenthesis blocks also fails with strange error messages, it seems 
to discover some parser/token internals. 
call (echo one ^| echo two)

cmdしたがって、シェルの構造化された構文と動作を実際には誰も知らないか、定義しようとさえしなかったという私の印象。

于 2012-10-16T18:57:18.783 に答える