NSIS Inetc得到:我可以将下载的文件变成一个变量吗?

时间:2015-11-11 09:29:43

标签: nsis

当我在其中添加了File_1234.exe时,代码正在运行。但文件名更改,download.php重定向到exe。因此,我不想在那里拥有固定的文件名,而是希望有一个代码,我不需要指定文件名。

是否可以用代码替换第一个File_1234.exe来下载URL提供的任何文件,因此用运行(ExecShell)此下载文件的代码替换第二个File_1234.exe?感谢

代码本身就在这里:

Section "File"
inetc::get "http://example.com/download.php" "$pluginsdir\File_1234.exe"
Pop $0
DetailPrint "Result: $R0"
    ExecShell "" '"$pluginsdir\File_1234.exe"'
SectionEnd

3 个答案:

答案 0 :(得分:1)

INetC没有将INTERNET_FLAG_NO_AUTO_REDIRECT标志传递给WinInet的标志,因此当服务器返回30x重定向代码时,无法执行头请求并找到该位置。

如果您可以修改download.php,只需在存在特殊参数时将最终URL作为小文本文件返回,那么您可以发出两个GET请求,第一个获取名称,第二个执行主下载:

Section

InitPluginsDir
StrCpy $0 "http://example.com/download.php?fileid=1234"
inetc::get /SILENT "$0&locationonly=1" "$PluginsDir\location.txt" /END
FileOpen $1 "$PluginsDir\location.txt" R
FileRead $1 $2
FileClose $1
StrLen $1 $2
loop:
    IntOp $1 $1 - 1
    StrCpy $3 $2 1 $1
    StrCmp $3 '/' 0 +4
        IntOp $1 $1 + 1
        StrCpy $3 $2 "" $1
        Goto +2
    StrCmp $3 "" 0 loop
StrCmp $3 "" nofilename
inetc::get "$0" "$PluginsDir\$3" /END
Goto done
nofilename:
MessageBox mb_iconstop "Unable to parse filename from $2"
done:

SectionEnd

此示例假定http://example.com/download.php?fileid=1234会下载文件,但http://example.com/download.php?fileid=1234&&locationonly=1只返回http://example.com/myfiles/whatever.exe

这样的网址

答案 1 :(得分:0)

如果您的“http://example.com/download.php”返回要下载的文件的URL,则可以执行此操作。 我的意思是:download.php将URL作为文本返回(“http://example.com/file_12345.exe”)。

1)将此文本与inetc一起下载到某个本地文件并读入变量。 2)使用Inetc再次从URL(在变量中指定)下载文件作为生成的.exe文件。

这对你来说可以接受吗?

答案 2 :(得分:0)

这是5年后的答案,以帮助那些可能想知道如何获取inetc :: get输出到变量中的人;) 显然,从那时起您就找到了解决方案……无论如何:

inetc :: get有一个不错的选项/TOSTACK,可以做到这一点。

这是您的示例:

!include LogicLib.nsh

Section "File"
inetc::get /TOSTACK "http://example.com/download.php" ""
Pop $0
DetailPrint "Result: $0"
${If} $0 == 'OK'
    Pop $0
    StrCpy $filename $0 
    inetc::get /TOSTACK "http://example.com/$filename" "$PluginsDir\$filename"
    Pop $0
    ${If} $0 == 'OK'
        ExecShell "" '"$pluginsdir\$filename"'
    ${Else}
        MessageBox MB_OK "Cannot download file $filename"
    ${EndIf}
${Else}
    MessageBox MB_OK "Cannot fetch filename to download"
${EndIf}

SectionEnd