Script not recieving url properly

喜夏-厌秋 提交于 2019-12-01 19:25:53
MC ND

In this case the problem is that the windows scripting host consumes the double quotes included in the arguments.

npocmaka has shown one of the solutions: encode the quotes in the url. From my point of view it is the correct one (double quote is an unsafe character and should be encoded).

Another solution is to not to pass the URL as an argument to the script, but to store it in a environment variable and then in the javascript part retrieve the value from the variable

@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 );

Now, it can be called as

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

call the cscript like that:

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

I dont think the spaces needs to be encoded but rather the double quotes (with %22) though this could require to parse the whole command line (%*) you can try something like

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

You can also try with named arguments and pass the whole command line to the script.

simply replace the space or plus-sign + with a URL encoded space %20.

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!