当我在其中添加了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
答案 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