找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 14755|回复: 10

控制台下载工具pget.exe

[复制链接]
发表于 2017-4-19 23:49:16 | 显示全部楼层 |阅读模式
本帖最后由 happy886rr 于 2017-4-21 21:40 编辑
控制台下载工具pget,支持IP显示、彩显、通配符、断电续传、下载进度、速度、剩余时间提示等功能。假如我要下载的网址,某个地方不确定,用通配符(*)替代就行 http://www.a.com/(*).zip。
(图片为外链)
将该图存为a.zip,解压即可得到1.2版的二进制文件和所有源码,仅13KB大小,运行迅捷。

用法:

  1. -----------------------------------------------------------------
  2. pget -u[url] -n[number range] -r[root directory]
  3. -----------------------------------------------------------------
  4.      -h Show help information
  5.      -u Set the download url
  6.      -n Set the number range of the url
  7.      -r Set the download root directory
  8. -----------------------------------------------------------------
复制代码
举例:

  1. REM 单文件下载,使用-u开关指定下载地址
  2. pget -uhttp://ddd2.pc6.com/soft12/VC6.0green.rar

  3. REM 通配符下载,使用-n开关指定统配符范围
  4. pget -u http://img1.mm131.com/pic/1008/(*).jpg -n 1-10

  5. REM 用-r开关指定文件保存目录
  6. pget -u http://img1.mm131.com/pic/1008/(*).jpg -n 1-10 -r ".\test"
复制代码
pget最新1.3版源码,加入了对ftp、百度网盘超长链接下载的支持,1.3版仅做源码更新,不再提供新的二进制文件,且源码支持VC6.0直接编译。

  1. /*
  2. THE BATCH DOWNLOAD TOOL, COPYRIGHT@2017~2019 BY HAPPY, VERSION 1.3
  3. PGET.EXE
  4. -----------------------------------------------------------------
  5.                _
  6.    _       _ _(_)_     |  The Batch Download Tool with colorful ,
  7.   (_)     | (_) (_)    |  Copyright@2017~2019 By Happy, Pget.Exe
  8.    _ _   _| |_  __ _   |  Type "-h" for help.
  9.   | | | | | | |/ _` |  |  
  10.   | | |_| | | | (_| |  |  Version 1.3 (2017-04-21 21:28 UTC)
  11. _/ |\__'_|_|_|\__'_|  |  Official http://www.bathome.net/thread
  12. |__/                   |  -43879-1-1.html

  13. -----------------------------------------------------------------

  14.                       :;vLxLc;,                  
  15.                   ,JZMMBBBMBMBMBJi.               
  16.                 LRBMMRMRRDWZZKRMBMBDs            
  17.               rBMBWDDDKKPE00XZPHEGORRMu           
  18.             .ZBRODOG0XZZGZGKZKPaEHGEEKRD         
  19.            ,OBOROGZGZE0DZEZZ0ZPDKXZWK0SEE         
  20.           .EBORWGZDZKKDEGKGGEPWGZZWEZaEJB;        
  21.           UBRRDDGRWOOMRREOOOKOEGXKHWKPP2ZH        
  22.          7BRWGOGBMBMBMBBBMBMBRORWPPEO0ZPRO        
  23.          RMOEWOBRPr;:,:ruxc3x7DBMBOMRRGWMX        
  24.         ;MMEOOBP.  :SRBU:     ,iDOBBRRWWB:        
  25.         vBMGWBG.     .;ii:. .::::raGRRGBE         
  26.         :MBZMBJ         .,..;;PMOL,2BBBD.         
  27.          UMRRBx  . ..,.,.. ,:..,::7BMBZ.         
  28.           MRMMM ...:;..,;,:;:..  ,BMBK.           
  29.           0BMBR;...::;::;;;;,,..sBBB7            
  30.          :BRBi,i7:.  .:;r;:...;OBOJ               
  31.         ;BMBr ::i7;,.......sF                     
  32.     LGBBBMBMF:;,:;777i;;:1BMBRr                  
  33.   iBMBMBMMRBO7::.:ic7c77;aBBMBBBMBMBEZv:,:.      
  34. :BMZFHWMORRMOr...:icvvr;:KMBRRDOOODRWD1cr7:.     
  35. SRuis0MRRRRRREL,..,::::,:EMORRMOROOuu1i:. :::.   
  36. ;3Ba7aBRZGBROMBWF: .....:;0ZRRMMBMBMB7::7L:  .;rL;
  37. ;;SOZBMOJ,3BRRBBMRc..,.,,:2RRMOMF7rXJ;;7LZOMi.....
  38. 7:;0BSMWx; 7RRRRBMBD:.,,,:DEMRWWMPL,:iL;ir1BBJ:.  
  39. :. sBxsMM3; :MOBMBDBG:.,.;UaBMOWMBM0:;v1uSvLLLrri:
  40. J;. KWsLBMU:aMBMBMcLGx...:7JBMMWMU2H  .,rKR0J;;;r;
  41. JL7  .  iBDRMBMBO: .7x,..,;7MBMBRU 1J:       ....
  42. siJ7.:s1RMBRPcr:     ,:,::;.iRBMBMUGBMBOs:    . .
  43. :;rJUcJsrLL.           :;r,  .rZMMMBK0DBMBMu.   .
  44. ..7vJur7ir:  ::.        :.     :s;:r1L: .7BMBB3:  
  45. . :vs3rx;L. ...,        .,      .i:  .:.:r;;;DMBBM
  46. , .,727;,,.,:....                 ,::...3JLr   .JG
  47. . .,;U7;..:i;::;,..  .             :ir:rxu1v.     
  48. : ,.:xJ:..:;7iL3i.;:  ...      ..   :;1JLL07, ..,.
  49. : . .;v7ir:;;rvcr::7                 7ciLSU7.
  50. */

  51. #include   <stdio.h>
  52. #include  <stdlib.h>
  53. #include  <string.h>
  54. #include <windows.h>
  55. #include  <direct.h>
  56. #include    <time.h>
  57. #include    <math.h>
  58. #include      <io.h>
  59. #pragma comment(lib, "Ws2_32.lib")

  60. /*************宏量定义*************/
  61. #define SAFE_SIZE  1024
  62. #define FILE_EXIST 0

  63. //定义帮助说明
  64. #define HELP_INFORMATION "\
  65. -----------------------------------------------------------------\n\
  66. pget -u[url] -n[number range] -r[root directory]\n\
  67. -----------------------------------------------------------------\n\
  68.      -h Show help information\n\
  69.      -u Set the download url\n\
  70.      -n Set the number range of the url\n\
  71.      -r Set the download root directory\n\
  72. -----------------------------------------------------------------\n\
  73. version 1.3\n"

  74. #define STR_HEAD "\
  75. -------------Welcome you to use the pget download tool-----------"

  76. #define STR_LINE "\
  77. -----------------------------------------------------------------"

  78. /*************类型定义*************/
  79. typedef HRESULT (WINAPI *PGETA)(LPUNKNOWN,LPCSTR,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);

  80. /*************全局变量*************/
  81. static int M, N, Z;
  82. static char murl[SAFE_SIZE], mpath[SAFE_SIZE]=".\";
  83. static char proGRESS[64]={0};

  84. int OPTIND=1, OPTOPT;
  85. char* OPTARG;

  86. clock_t preTime;
  87. ULONG preProgress;

  88. HANDLE handle_out;

  89. /*************进度回调*************/
  90. class DownloadProgress :public IBindStatusCallback
  91. {
  92. public:
  93.         HRESULT __stdcall QueryInterface(const IID &, void **) {
  94.                 return E_NOINTERFACE;
  95.         }
  96.         ULONG STDMETHODCALLTYPE AddRef(void) {
  97.                 return 1;
  98.         }
  99.         ULONG STDMETHODCALLTYPE Release(void) {
  100.                 return 1;
  101.         }
  102.         HRESULT STDMETHODCALLTYPE OnStartBinding(DWORD dwReserved, IBinding *pib) {
  103.                 return E_NOTIMPL;
  104.         }
  105.         virtual HRESULT STDMETHODCALLTYPE GetPriority(LONG *pnPriority) {
  106.                 return E_NOTIMPL;
  107.         }
  108.         virtual HRESULT STDMETHODCALLTYPE OnLowResource(DWORD reserved) {
  109.                 return S_OK;
  110.         }
  111.         virtual HRESULT STDMETHODCALLTYPE OnStopBinding(HRESULT hresult, LPCWSTR szError) {
  112.                 return E_NOTIMPL;
  113.         }
  114.         virtual HRESULT STDMETHODCALLTYPE GetBindInfo(DWORD *grfBINDF, BINDINFO *pbindinfo) {
  115.                 return E_NOTIMPL;
  116.         }
  117.         virtual HRESULT STDMETHODCALLTYPE OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed) {
  118.                 return E_NOTIMPL;
  119.         }
  120.         virtual HRESULT STDMETHODCALLTYPE OnObjectAvailable(REFIID riid, IUnknown *punk) {
  121.                 return E_NOTIMPL;
  122.         }
  123.         virtual HRESULT __stdcall OnProgress(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText){
  124.                 if (ulProgressMax != 0){

  125.                         //进度百分数
  126.                         int downloadSpeed, restTime;
  127.                         int i=(int)ulProgress * 100.0 / (int)ulProgressMax;
  128.                         int j=i/2, disTime=(int)(clock()-preTime);
  129.                         if(disTime > 100){
  130.                                 downloadSpeed=((int)ulProgress-(int)preProgress) * CLOCKS_PER_SEC / disTime / 1000;
  131.                                 restTime=(downloadSpeed!=0) ?((int)ulProgressMax-(int)ulProgress) / downloadSpeed :99999;
  132.                                 preProgress=ulProgress, preTime+=disTime;
  133.                         }else if(i <100){
  134.                                 return S_OK;
  135.                         }
  136.                        
  137.                         if(i==100){
  138.                                 downloadSpeed=restTime=0;
  139.                         }

  140.                         for(int n=1; n<=j; n++){
  141.                                 proGRESS[n]='=';
  142.                         }

  143.                         //显示进度百分比
  144.                         fprintf(stdout, "\r%s%3d%% %3dKB/s,%3dm%02ds ", proGRESS, i, downloadSpeed, restTime/1000/60, restTime/1000%60);
  145.                         fflush(stdout);
  146.                 }
  147.                 return S_OK;
  148.         }
  149. };

  150. /*************功能函数*************/
  151. //彩显函数
  152. int ColorString(HANDLE handle_out, char* pstrA, char* pstrB, int colorA, int colorB, int num)
  153. {
  154.         SetConsoleTextAttribute(handle_out, colorA);  //项目色
  155.         fprintf(stdout, pstrA);
  156.         SetConsoleTextAttribute(handle_out, colorB);  //数据色
  157.         (num<0)?fprintf(stdout, pstrB):fprintf(stdout, "%d\n", num);
  158.         return 0;
  159. }
  160. //判断字母
  161. BOOL isLetter(char* p)
  162. {
  163.         return (p && (('A'<=*p&&*p<='Z')||('a'<=*p&&*p<='z'))&&(*(p+1)=='\0'))?TRUE:FALSE;
  164. }
  165. //子串查找/i版
  166. char* strrstr(const char *dst, const char *src)  
  167. {  
  168.         const char *pdst=dst, *psrc=src;
  169.         char *ret=NULL;  
  170.         while(*dst){
  171.                 while(*pdst==*psrc){

  172.                         if(*pdst=='\0'){
  173.                                 return ret=(char*)dst;
  174.                         }else{  
  175.                                 pdst++;  
  176.                                 psrc++;  
  177.                         }  
  178.                 }  
  179.                 if(*psrc=='\0'){ret=(char*)dst;}
  180.                 pdst=++dst;  
  181.                 psrc=src;  
  182.         }  
  183.         return ret;  
  184. }
  185. //域名IP解析
  186. int URLDownloadToIP(HANDLE handle_out, const char* downloadURL)
  187. {
  188.         WSADATA wsaData;  
  189.         WSAStartup(MAKEWORD(2,2), &wsaData);

  190.         char *pstr=(char*)downloadURL, *urlweb=(char*)calloc(SAFE_SIZE, sizeof(char)), *tstr=urlweb;

  191.         while(*pstr!=':'){pstr++;}
  192.         pstr+=3;
  193.         while(*pstr!='/'&& *pstr!='\n' && *pstr!='\0'){
  194.                 *tstr++=*pstr++;
  195.         }

  196.         const char* pszUrl=(const char*)urlweb;

  197.         if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
  198.                 //fprintf(stdout, "Init socket faile\n");  
  199.                 return 1;  
  200.         }
  201.         struct hostent *pHost = gethostbyname(pszUrl);

  202.         if (pHost == NULL) {  
  203.                 WSACleanup();  
  204.                 //fprintf(stdout, "pHost == NULL \n");  
  205.                 return 1;  
  206.         }

  207.         //主机正式名称
  208.         ColorString(handle_out, "[URL-HOST] ", (pHost)?pHost->h_name:"NULL", 4|8, 1|2|8, -1);
  209.         fprintf(stdout, "\n");

  210.         //主机别名,可以有多个
  211.         int iIndex = 0;  
  212.         while(pHost->h_aliases[iIndex]) {
  213.                 ColorString(handle_out, "[URLALIAS] ", pHost->h_aliases[iIndex], 4|8, 1|2|8, -1);
  214.                 fprintf(stdout, "\n");
  215.                 iIndex++;  
  216.         }

  217.         //地址字节数,IPV4是4,IPV6是6
  218.         if(pHost->h_length==4) {
  219.                 ColorString(handle_out, "[IP-VTYPE] ", "IPV4\n", 4|8, 4|8, -1);
  220.         }
  221.         else if(pHost->h_length==6) {
  222.                 ColorString(handle_out, "[IP-VTYPE] ", "IPV6\n", 4|8, 4|8, -1);
  223.         }

  224.         iIndex = 0;
  225.         while(pHost->h_addr_list[iIndex]) {
  226.                 ColorString(handle_out, "[IP-ADDRE] ", inet_ntoa(*(struct in_addr*)pHost->h_addr_list[iIndex]), 4|8, 2|4|8, -1);
  227.                 fprintf(stdout, "\n");
  228.                 iIndex++;  
  229.         }   
  230.         WSACleanup();

  231.         //释放空间
  232.         free(urlweb);
  233.         return 0;
  234. }
  235. //开关解析
  236. int GetOpt(int nargc, char *nargv[], char *ostr)
  237. {
  238.         static char* place="";
  239.         static char* lastostr=(char *) 0;
  240.         register char* oli;
  241.         char* index();
  242.         if(ostr!=lastostr){
  243.                 lastostr=ostr;
  244.                 place="";
  245.         }
  246.         if(!*place){
  247.                 if(
  248.                         (OPTIND>=nargc)              ||
  249.                         (*(place=nargv[OPTIND])!='-')||
  250.                         (!*(++place))
  251.                 ){
  252.                         place="";
  253.                         return(EOF);
  254.                 }
  255.                 if (*place == '-' && place[1] == 0){
  256.                         ++OPTIND;
  257.                         return(EOF);
  258.                 }
  259.         }
  260.         if ((OPTOPT=(int)*place++)==(int)':' || !(oli=strchr(ostr, OPTOPT))){
  261.                 if(!*place){++OPTIND;}
  262.         }
  263.        
  264.         if (oli != NULL && *(++oli) != ':'){
  265.                 OPTARG=NULL;
  266.                 if(!*place){++OPTIND;}
  267.         }
  268.         else{
  269.                 if(*place){
  270.                         OPTARG=place;
  271.                 }else if(nargc<=++OPTIND){
  272.                         place="";
  273.                 }else{
  274.                         OPTARG=nargv[OPTIND];
  275.                 }
  276.                 place="";
  277.                 ++OPTIND;
  278.         }
  279.         return(OPTOPT);
  280. }

  281. /*************下载函数*************/
  282. int URLGetToFile(void)
  283. {
  284.         //装载DLL模块
  285.         HMODULE hLib=LoadLibraryW(L"URLMON");
  286.         if(hLib==NULL){
  287.                 fprintf(stdout, "ERROR");
  288.                 return 1;
  289.         }

  290.         //过小红伞本地查杀
  291.         PGETA PgetUrlToFileA=(PGETA)GetProcAddress(hLib, "URLDownloadToFileA");

  292.         //是否启用通配符
  293.         BOOL useMARK=FALSE;

  294.         //分配URL字串
  295.         char* aurl =(char*)calloc(SAFE_SIZE, sizeof(char));
  296.         char* durl =(char*)calloc(SAFE_SIZE, sizeof(char));
  297.         char* dest =(char*)calloc(SAFE_SIZE, sizeof(char));
  298.         char* pftr =(char*)calloc(       16, sizeof(char));

  299.         //定义URL指针
  300.         char *purl=NULL, *surl=NULL, *pdit=NULL;
  301.        
  302.         //批量下载
  303.         for(int i=M; i<=N; i++){

  304.                    surl=murl, purl=aurl;

  305.                 while(*surl !='\0'){
  306.                         //替换正则标签
  307.                         if(*surl=='(' && *(surl+1)=='*' && *(surl+2)==')'){

  308.                                 useMARK=TRUE;

  309.                                 if(Z >0){
  310.                                         sprintf(pftr, "%%0%dd", Z);
  311.                                         sprintf(dest, pftr, i);

  312.                                 }else if(Z==-1){
  313.                                         sprintf(dest, "%c",  (char)i);

  314.                                 }else{
  315.                                         sprintf(dest, "%d",  i);
  316.                                 }

  317.                                 pdit=dest;
  318.                                
  319.                                 while(*pdit !='\0'){
  320.                                         *(purl++)=*(pdit++);               
  321.                                 }
  322.                                 surl+=3;
  323.                                        
  324.                         }else{
  325.                                 *(purl++)=*(surl++);
  326.                         }
  327.                 }
  328.                 //置结束符
  329.                 *purl='\0';

  330.                 strcpy(durl, mpath);
  331.                 strcat(durl, "\");
  332.                 strcat(durl, strrchr(aurl, '/')+1);
  333.                
  334.                 //截断特殊字符
  335.                 purl=durl;
  336.                 while(
  337.                         *purl!='?' &&
  338.                         *purl!='*' &&
  339.                         *purl!='"' &&
  340.                         *purl!='>' &&
  341.                         *purl!='<' &&
  342.                         *purl!='|' &&
  343.                         *purl!='\0'
  344.                 ){purl++;}
  345.                 *purl='\0';

  346.                 //显示下载网址
  347.                 ColorString(handle_out, "[*] ", aurl, 4|8, 1|2|8, -1);
  348.                 fprintf(stdout, "\n");

  349.                 //绘制进度框
  350.                 ColorString(handle_out, "", (char*)proGRESS, 4|8, 2|4|8, -1);

  351.                 //进度归零
  352.                 memset(proGRESS, ' ', 51);
  353.                 proGRESS[0]='[', proGRESS[51]=']';

  354.                 preTime=clock();
  355.                 preProgress=(ULONG)0;

  356.                 //进度回调入口
  357.                 DownloadProgress progress;
  358.                 IBindStatusCallback* callback=(IBindStatusCallback*)&progress;

  359.                 //调用API下载
  360.                 if (PgetUrlToFileA(NULL, aurl, durl, 0, static_cast<IBindStatusCallback*>(&progress)) != S_OK){
  361.                         fprintf(stdout, "ERROR");
  362.                 }

  363.                 //统一换行
  364.                 fputs("\n\n", stdout);

  365.                 if(useMARK==FALSE){
  366.                         break;
  367.                 }
  368.         }

  369.         //清理工作
  370.         free(aurl);
  371.         free(durl);
  372.         free(dest);
  373.         free(pftr);
  374.         return 0;
  375. }

  376. /*************MAIN函数*************/
  377. int main(int argc, char** argv)
  378. {
  379.         if(argc<2){
  380.                 //无参数则退出
  381.                 fprintf(stdout, HELP_INFORMATION);
  382.                 exit(0);
  383.         }

  384.         int flag=0, K;
  385.         while((K=GetOpt(argc,argv,"hu:n:r:"))!=-1)
  386.         {
  387.                 switch(K)
  388.                 {
  389.                 case 'h':
  390.                 case 'H':
  391.                         fprintf(stdout, HELP_INFORMATION);
  392.                         exit(0);

  393.                 case 'u':
  394.                 case 'U':
  395.                         if(OPTARG !=NULL){
  396.                                 strcpy(murl, OPTARG);
  397.                                 flag=1;
  398.                         }
  399.                         break;

  400.                 case 'n':
  401.                 case 'N':
  402.                         if(OPTARG !=NULL){
  403.                                 char *snumsrc=strtok(OPTARG, " \t-"), *tmps=(snumsrc!=NULL)?strtok(NULL, " \t-"):NULL, *zp=snumsrc;

  404.                                 if(isLetter(snumsrc) && isLetter(tmps)){
  405.                                         int exnum1=*snumsrc, exnum2=*tmps;
  406.                                         Z=-1;
  407.                                         M=(exnum1 <= exnum2)?(N=exnum2, exnum1):(N=exnum1, exnum2);

  408.                                 }else if(tmps!=NULL){               
  409.                                         if(*zp=='0'){
  410.                                                 while('0'<= *zp && *zp <='9'){
  411.                                                         Z++;
  412.                                                         zp++;
  413.                                                 }
  414.                                         }
  415.                                         M=atoi(snumsrc), N=atoi(tmps);
  416.                                         if(M>N){
  417.                                                 int exnum=M;
  418.                                                 M=N, N=exnum;
  419.                                         }
  420.                                 }       
  421.                         }
  422.                         break;

  423.                 case 'r':
  424.                 case 'R':
  425.                         if(OPTARG !=NULL){
  426.                                 strcpy(mpath, OPTARG);
  427.                         }
  428.                         break;

  429.                 default:
  430.                         fprintf(stdout, "Unknown switch '-%c'\n", K);
  431.                         exit(1);
  432.                 }
  433.         }

  434.         //判断是否有网址参数
  435.         if(flag==0){
  436.                 fprintf(stdout, "Needs download url\n");
  437.                 exit(1);       
  438.         }

  439.         //判断网址是否超长
  440.         if(strlen(murl)>768){
  441.                 fprintf(stdout, "Download url too long\n");
  442.                 exit(1);       
  443.         }

  444.         //判断网址是否有效
  445.         if(
  446.                 (strrchr((const char*)murl, '/')==NULL) ||
  447.                 (
  448.                          (strrstr((const char*)murl, "http://" ) != murl) &&
  449.                         (strrstr((const char*)murl, "https://") != murl) &&
  450.                         (strrstr((const char*)murl, "ftp://"  ) != murl) &&
  451.                         (strrstr((const char*)murl, "ftps://" ) != murl)
  452.                 )
  453.         ){
  454.                 fprintf(stdout, "The url is error\n");
  455.                 exit(1);       
  456.         }

  457.         //下载目录不否存则创建
  458.         if(_access(mpath, FILE_EXIST)!=0){
  459.                 _mkdir(mpath);
  460.         }
  461.         //无法创建下载目录退出
  462.         if(_access(mpath, FILE_EXIST)!=0){
  463.                 fprintf(stdout, "Can not creat the download directory\n");
  464.                 exit(1);       
  465.         }

  466.         //获取控制台输出句柄
  467.         handle_out=GetStdHandle(STD_OUTPUT_HANDLE);

  468.         //获取控制台初始配色
  469.         WORD orgCOLOR;
  470.         CONSOLE_SCREEN_BUFFER_INFO buffINFO;
  471.         GetConsoleScreenBufferInfo(handle_out, &buffINFO);
  472.         orgCOLOR=buffINFO.wAttributes;

  473.         //显示目标网站IP
  474.         ColorString(handle_out, STR_HEAD, "\n", 4|8, 2|4|8, -1);
  475.         URLDownloadToIP(handle_out, murl);
  476.         ColorString(handle_out, STR_LINE, "\n", 4|8, 2|4|8, -1);

  477.         //调用下载函数
  478.         URLGetToFile();

  479.         //还原字体颜色
  480.         SetConsoleTextAttribute(handle_out, orgCOLOR);
  481.         return 0;
  482. }
复制代码
发表于 2017-4-20 00:29:03 | 显示全部楼层
这个是否支持https连接下载,是否支持设置代((理
 楼主| 发表于 2017-4-20 00:39:47 | 显示全部楼层
回复 2# freesoft00
理论上都支持,我刚测试过,支持https,代理自己写上ip端口试试。
发表于 2017-4-20 11:45:30 | 显示全部楼层
传一个备份,回头上传到 Batch-CN
已用 strip 和 upx 压缩体积,另,HELP_INFORMATION 的末尾应该有个 \n 才对
发表于 2017-4-20 12:14:10 | 显示全部楼层
毕竟是在 windows 下使用,建议以后的作品考虑一下适配宽字符的情况
 楼主| 发表于 2017-4-20 13:20:27 | 显示全部楼层
回复 5# CrLf
好的,不过url一般都是ascii码组成的,ansi C已经够用。
发表于 2017-4-20 14:22:36 | 显示全部楼层
回复 6# happy886rr


    是啊,一般连中文都会变成 UTF8的URL编制形式(%e4%b8%ad)
发表于 2017-4-20 20:32:28 | 显示全部楼层
卧槽,怎么编译到这么小的
 楼主| 发表于 2017-4-20 20:46:06 | 显示全部楼层
本帖最后由 happy886rr 于 2017-4-20 20:50 编辑

回复 8# CrLf
MD版,只要安装了QQ,就带那个dll,所以直接MD版 。第一版getopt的开关也写错了,1.1版都做了修正。
发表于 2017-4-20 22:44:27 | 显示全部楼层
回复 9# happy886rr


    目前直接运行看到的提示最后一行是两行黏在一起的,建议下次更新时在 version 后补个 \n
 楼主| 发表于 2017-4-20 23:09:02 | 显示全部楼层
本帖最后由 happy886rr 于 2017-4-21 13:45 编辑

回复 10# CrLf
好的,已过360免杀,模仿hash.c。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:20 , Processed in 0.014744 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表