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"

好的,最后我找到了插入符号 ( ^) 转义的地方以及应该用插入符号转义的内容:

第四,所有不在双引号中的保留 shell 字符都必须转义。这些字符对 Windows NT 命令外壳具有特殊意义。保留的 shell 字符是:

& | ( ) < > ^

要将保留的 shell 字符作为命令参数的一部分传递,必须将整个参数括在双引号中,或者必须对保留字符进行转义。在保留字符前加上克拉 (^) 字符以对其进行转义。例如,以下命令示例将无法按预期工作,因为 < 和 > 是保留的 shell 字符:

来源 (http://technet.microsoft.com/en-us/library/cc723564.aspx) 显然是对收集在一个文档中的 CMD 脚本中一些未明确定义的内容的良好阅读。但是它没有描述 '%' 引用。尽管如此,我发现一个地方提到了这个%%案例,但不是在一般情况下:

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)

因此,我的印象是没有人真正知道甚至试图定义或多或少结构化的cmdshell 语法和行为。

于 2012-10-16T18:57:18.783 回答