脚本无法正确接收网址

时间:2016-09-20 07:30:23

标签: javascript windows batch-file url space

我使用的是一个组合批处理和java脚本,我发现使用批处理文件从网站检索html,并且当我在firefox中使用url时,我们的地址没有返回所需的输出。

我用来拉取html的脚本是:

@if (@This==@IsBatch) @then
@echo off
rem **** batch zone     *********************************************************

setlocal enableextensions disabledelayedexpansion

rem Batch file will delegate all the work to the script engine 
if not "%~1"=="" (
    cscript //E:JScript "%~dpnx0" %1
)

rem End of batch area. Ensure batch ends execution before reaching
rem javascript zone
exit /b

@end
// **** Javascript zone     *****************************************************

// Instantiate the needed component to make url queries
var http = WScript.CreateObject('MSXML2.ServerXMLHTTP.6.0');

// Retrieve the url parameter
var url = WScript.Arguments.Item(0)

// Make the request

http.open("GET", url, false);
http.send();

// If we get a OK from server (status 200), echo data to console

if (http.status === 200) WScript.StdOut.Write(http.responseText);

// All done. Exit
WScript.Quit(0);

我尝试提供脚本的网址是http://gatherer.wizards.com/Pages/Search/Default.aspx?output=spoiler&method=visual&action=advanced&set=["阿拉伯+夜晚"]

或者另外http://gatherer.wizards.com/Pages/Search/Default.aspx?output=spoiler&method=visual&action=advanced&set=["阿拉伯之夜"]

问题似乎是空格/ +因为我提供的其他网址都没有使用空格或+

我调用脚本来拉取html的方式是:

call callurl.cmd "http://gatherer.wizards.com/Pages/Search/Default.aspx?output=spoiler&method=visual&action=advanced&set=["Arabian+Nights"]"

编辑:发现原始帖子的脚本来自Open a URL without using a browser from a batch file

只有我做的更改是Msxml2.XMLHTTP.6.0已更改为MSXML2.ServerXMLHTTP.6.0,因为原始脚本由于我发现的安全性而无法加载网站。

3 个答案:

答案 0 :(得分:5)

在这种情况下,问题是windows脚本主机使用参数中包含的双引号。

npocmaka已显示one of the solutions:对网址中的引号进行编码。从我的观点来看,这是正确的(双引号是一个不安全的字符,应编码)。

另一种解决方案是不将URL作为参数传递给脚本,而是将其存储在环境变量中,然后在javascript部分中从变量中检索值

@if (@This==@IsBatch) @then
@echo off
rem **** batch zone *********************************************************

    setlocal enableextensions disabledelayedexpansion

    rem Ensure we get a correct reference to current batch file
    call :getFullBatchReference _f0

    rem Batch file will delegate all the work to the script engine 
    if not "%~1"=="" (
        set "URL=%~1"
        cscript //nologo //E:JScript "%_f0%"
    )

    rem Ensure batch ends execution before reaching javascript zone
    exit /b %errorlevel%

:getFullBatchReference returnVar
    set "%~1=%~f0"
    goto :eof

@end
// **** Javascript zone *****************************************************
// Instantiate the needed component to make url queries
var http = WScript.CreateObject('MSXML2.ServerXMLHTTP.6.0');

// Retrieve the url parameter from environment variable
var url = WScript.CreateObject('WScript.Shell')
            .Environment('Process')
            .Item('URL');

var exitCode = 0;

    try {
        // Make the request
        http.open("GET", url, false);
        http.send();

        // If we get a OK from server (status 200), echo data to console
        if (http.status === 200) {
            WScript.StdOut.Write(http.responseText);
        } else {
            exitCode = http.status;
        };

    } catch (e) {
        // Something failed
        WScript.StdOut.Write('ERROR: ' + e.description );
        exitCode = 1;
    };

    // All done. Exit
    WScript.Quit( exitCode );

现在,它可以被称为

geturl.cmd "http://gatherer.wizards.com/Pages/Search/Default.aspx?output=spoiler&method=visual&action=advanced&set=["Arabian+Nights"]"

答案 1 :(得分:3)

像这样调用cscript:

cscript //E:JScript "%~dpnx0" "%~1"

我不认为空格需要编码,而是双引号(%22)虽然这可能需要解析整个命令行(%*)你可以尝试像

setlocal enableDelayedExpansion
set "link=%*"
set "link=!link:"=%%22!"
....
 cscript //E:JScript "%~dpnx0" "%link%"

您也可以尝试使用named arguments并将整个命令行传递给脚本。

答案 2 :(得分:0)

只需使用网址编码空格替换空格+或加号%20

e.g。 http://gatherer.wizards.com/Pages/Search/Default.aspx?output=spoiler&method=visual&action=advanced&set=["阿拉伯%20Nights"]