0

我需要一批从 http 网站 ( http://www.rarlab.com/download.htm ) 下载文件。在这个网站上,我只需要 32 位和 64 位英文程序的最新版本,它总是列在这个网站的顶部。

问题一:网站上下载的文件不止这两个

问题 2:文件的名称随着每个新版本的变化而变化

我如何在不知道确切文件名的情况下下载这 2 个文件(最新版本)(并且无需先访问网页以查找文件名)?

也许我可以使用 wget、curl 或 aria2 来完成该任务,但我不知道参数/选项。

谁能帮我解决这个问题?

(请只使用批处理解决方案 - 没有 vbs、java、jscript、powershell 等)

谢谢你。

抱歉,我忘了说我使用的是 Windows 7 32 位。而且我更喜欢批处理,因为脚本应该能够在所有 Windows 版本上运行,而无需为不同的 Windows 版本下载额外的程序或资源包(如 powershell 必须为 windows xp 等下载) - 因为我只理解批处理脚本。

4

1 回答 1

0

这是一个批处理 + JScript 混合脚本。我知道你说没有 vbs、java、jscript 等,但你将很难用纯批处理抓取 HTML。但这确实符合您的其他标准——在所有 Windows 版本上运行,无需依赖可选软件(如 powershell 或 .Net)。* 使用 JScript 的XMLHTTP对象,您甚至不需要 3rd 方应用程序来获取 Web 内容。

至于不了解 JScript,除了一些专有的 ActiveX 对象之外,它就像 JavaScript。如果您不熟悉 JavaScript 或正则表达式,我添加了大量的注释来帮助您。希望无论我懒得评论什么,它的作用都很明显。

更新

该脚本现在检测系统区域设置,将其与 WinRAR 下载页面上的语言匹配,并下载该语言版本。

无论如何,使用.bat扩展名保存它并像运行任何其他批处理脚本一样运行它。

@if (@a==@b) @end /*

:: batch script portion

@echo off
setlocal

set "url=http://www.rarlab.com/download.htm"
set /p "savepath=Location to save? [%cd%] "

if "%savepath%"=="" set "savepath=%cd%"

cscript /nologo /e:jscript "%~f0" "%url%" "%savepath%"

goto :EOF

:: JScript portion */

// populate translation from locale identifier hex value to WinRAR language label
// http://msdn.microsoft.com/en-us/library/dd318693.aspx
var abbrev={}, a=function(arr,val){for(var i=0;i<arr.length;i++)abbrev[arr[i]]=val};
a(['1401','3c01','0c01','0801','2001','4001','2801','1c01','3801','2401'],'Arabic');
a(['042b'],'Armenian');
a(['082c','042c'],'Azerbaijani');
a(['0423'],'Belarusian');
a(['0402'],'Bulgarian');
a(['0403'],'Catalan');
a(['7c04'],'Chinese Traditional');
a(['0c04','1404','1004','0004'],'Chinese Simplified');
a(['101a'],'Croatian');
a(['0405'],'Czech');
a(['0406'],'Danish');
a(['0813','0413'],'Dutch');
a(['0425'],'Estonian');
a(['040b'],'Finnish');
a(['080c','0c0c','040c','140c','180c','100c'],'French');
a(['0437'],'Georgian');
a(['0c07','0407','1407','1007','0807'],'German');
a(['0408'],'Greek');
a(['040d'],'Hebrew');
a(['040e'],'Hungarian');
a(['0421'],'Indonesian');
a(['0410','0810'],'Italian');
a(['0411'],'Japanese');
a(['0412'],'Korean');
a(['0427'],'Lithuanian');
a(['042f'],'Macedonian');
a(['0414','0814'],'Norwegian');
a(['0429'],'Persian');
a(['0415'],'Polish');
a(['0816'],'Portuguese');
a(['0416'],'Portuguese Brazilian');
a(['0418'],'Romanian');
a(['0419'],'Russian');
a(['7c1a','1c1a','0c1a'],'Serbian Cyrillic');
a(['181a','081a'],'Serbian Latin');
a(['041b'],'Slovak');
a(['0424'],'Slovenian');
a(['2c0a','400a','340a','240a','140a','1c0a','300a','440a','100a','480a','080a','4c0a','180a','3c0a','280a','500a','0c0a','040a','540a','380a','200a'],'Spanish');
a(['081d','041d'],'Swedish');
a(['041e'],'Thai');
a(['041f'],'Turkish');
a(['0422'],'Ukranian');
a(['0843','0443'],'Uzbek');
a(['0803'],'Valencian');
a(['042a'],'Vietnamese');

function language() {
    var os = GetObject('winmgmts:').ExecQuery('select Locale from Win32_OperatingSystem');
    var locale = new Enumerator(os).item().Locale;

    // default to English if locale is not in abbrev{}
    return abbrev[locale.toLowerCase()] || 'English';
}

function fetch(url) {
    var xObj = new ActiveXObject("Microsoft.XMLHTTP");
    xObj.open("GET",url,true);
    xObj.setRequestHeader('User-Agent','XMLHTTP/1.0');
    xObj.send('');
    while (xObj.readyState != 4) WSH.Sleep(50);
    return(xObj);
}

function save(xObj, file) {
    var stream = new ActiveXObject("ADODB.Stream");
    with (stream) {
        type = 1; // binary
        open();
        write(xObj.responseBody);
        saveToFile(file, 2); // overwrite
        close();
    }
}

// fetch the initial web page
var x = fetch(WSH.Arguments(0));

// make HTML response all one line
var html = x.responseText.split(/\r?\n/).join('');

// create array of hrefs matching *.exe where the link text contains system language
var r = new RegExp('<a\\s*href="[^"]+\\.exe(?=[^\\/]+' + language() + ')', 'g');
var anchors = html.match(r)

// use only the first two
for (var i=0; i<2; i++) {

    // use only the stuff after the quotation mark to the end
    var dl = '' + /[^"]+$/.exec(anchors[i]);

    // if the location is a relative path, prepend the domain
    if (dl.substring(0,1) == '/') dl = /.+:\/\/[^\/]+/.exec(WSH.Arguments(0)) + dl;

    // target is path\filename
    var target=WSH.Arguments(1) + '\\' + /[^\/]+$/.exec(dl)

    // echo without a new line
    WSH.StdOut.Write('Saving ' + target + '... ');

    // fetch file and save it
    save(fetch(dl), target);

    WSH.Echo('Done.');
}

更新 2

这是相同的脚本,经过一些小调整,使其还可以检测 Windows 的体系结构(32/64 位),并且只下载一个安装程序而不是两个:

@if (@a==@b) @end /*

:: batch script portion

@echo off
setlocal

set "url=http://www.rarlab.com/download.htm"
set /p "savepath=Location to save? [%cd%] "

if "%savepath%"=="" set "savepath=%cd%"

cscript /nologo /e:jscript "%~f0" "%url%" "%savepath%"

goto :EOF

:: JScript portion */

// populate translation from locale identifier hex value to WinRAR language label
// http://msdn.microsoft.com/en-us/library/dd318693.aspx
var abbrev={}, a=function(arr,val){for(var i=0;i<arr.length;i++)abbrev[arr[i]]=val};
a(['1401','3c01','0c01','0801','2001','4001','2801','1c01','3801','2401'],'Arabic');
a(['042b'],'Armenian');
a(['082c','042c'],'Azerbaijani');
a(['0423'],'Belarusian');
a(['0402'],'Bulgarian');
a(['0403'],'Catalan');
a(['7c04'],'Chinese Traditional');
a(['0c04','1404','1004','0004'],'Chinese Simplified');
a(['101a'],'Croatian');
a(['0405'],'Czech');
a(['0406'],'Danish');
a(['0813','0413'],'Dutch');
a(['0425'],'Estonian');
a(['040b'],'Finnish');
a(['080c','0c0c','040c','140c','180c','100c'],'French');
a(['0437'],'Georgian');
a(['0c07','0407','1407','1007','0807'],'German');
a(['0408'],'Greek');
a(['040d'],'Hebrew');
a(['040e'],'Hungarian');
a(['0421'],'Indonesian');
a(['0410','0810'],'Italian');
a(['0411'],'Japanese');
a(['0412'],'Korean');
a(['0427'],'Lithuanian');
a(['042f'],'Macedonian');
a(['0414','0814'],'Norwegian');
a(['0429'],'Persian');
a(['0415'],'Polish');
a(['0816'],'Portuguese');
a(['0416'],'Portuguese Brazilian');
a(['0418'],'Romanian');
a(['0419'],'Russian');
a(['7c1a','1c1a','0c1a'],'Serbian Cyrillic');
a(['181a','081a'],'Serbian Latin');
a(['041b'],'Slovak');
a(['0424'],'Slovenian');
a(['2c0a','400a','340a','240a','140a','1c0a','300a','440a','100a','480a','080a','4c0a','180a','3c0a','280a','500a','0c0a','040a','540a','380a','200a'],'Spanish');
a(['081d','041d'],'Swedish');
a(['041e'],'Thai');
a(['041f'],'Turkish');
a(['0422'],'Ukranian');
a(['0843','0443'],'Uzbek');
a(['0803'],'Valencian');
a(['042a'],'Vietnamese');

function language() {
    var os = GetObject('winmgmts:').ExecQuery('select Locale from Win32_OperatingSystem');
    var locale = new Enumerator(os).item().Locale;

    // default to English if locale is not in abbrev{}
    return abbrev[locale.toLowerCase()] || 'English';
}

function fetch(url) {
    var xObj = new ActiveXObject("Microsoft.XMLHTTP");
    xObj.open("GET",url,true);
    xObj.setRequestHeader('User-Agent','XMLHTTP/1.0');
    xObj.send('');
    while (xObj.readyState != 4) WSH.Sleep(50);
    return(xObj);
}

function save(xObj, file) {
    var stream = new ActiveXObject("ADODB.Stream");
    with (stream) {
        type = 1; // binary
        open();
        write(xObj.responseBody);
        saveToFile(file, 2); // overwrite
        close();
    }
}

// fetch the initial web page
var x = fetch(WSH.Arguments(0));

// make HTML response all one line
var html = x.responseText.split(/\r?\n/).join('');

// get OS architecture (This method is much faster than the Win32_Processor.AddressWidth method)
var os = GetObject('winmgmts:').ExecQuery('select OSArchitecture from Win32_OperatingSystem');
var arch = /\d+/.exec(new Enumerator(os).item().OSArchitecture) * 1;

// get link matching *.exe where the link text contains system language and architecture
var r = new RegExp('<a\\s*href="[^"]+\\.exe(?=[^\\/]+' + language() + '[^<]+' + arch + '\\Wbit)');
var link = r.exec(html)

// use only the stuff after the quotation mark to the end
var dl = '' + /[^"]+$/.exec(link);

// if the location is a relative path, prepend the domain
if (dl.substring(0,1) == '/') dl = /.+:\/\/[^\/]+/.exec(WSH.Arguments(0)) + dl;

// target is path\filename
var target=WSH.Arguments(1) + '\\' + /[^\/]+$/.exec(dl)

// echo without a new line
WSH.StdOut.Write('Saving ' + target + '... ');

// fetch file and save it
save(fetch(dl), target);

WSH.Echo('Done.');
于 2013-04-03T01:48:11.773 回答