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

快速bcn工具fbcn.exe

[复制链接]
发表于 2017-4-28 01:15:08 | 显示全部楼层 |阅读模式
下载地址链接: https://pan.baidu.com/s/1UH4IfKqxcwJyharcgEqz1Q?pwd=t327(包含源码演示,仅17KB)
FBCN.EXE 1.0 (FAST BCN TOOL BY HAPPY)

摘要:
====================================================
FBCN快速第三方包管理工具,完全颠覆你对包管理的认识。内存运算查表,速度秒杀一
切类似工具。 独创YUM云序列号,每个第三方拥有唯一的云序列YUM-SN,依靠YUM-SN序
列号去管理本地包。如果已下载unrar,那么针对rar类型的包,会自动解压安装到本地
目录。爽快的击键查询让你终生难忘。

备注:个别电脑如无法运行,请下载msvcr100.dll放入fbcn.exe所在目录即可。
====================================================

传参:
----------------------------------------------------------------------------------
fbcn -y[下载源地址] -t[列表地址] -m[最大行数]
----------------------------------------------------------------------------------
     -h 获取帮助信息
     -y 指定下载源地址
     -t 指定第三方列表地址
     -m 指定最大展示行数目
----------------------------------------------------------------------------------

示例:
----------------------------------------------------------------------------------
fbcn -m20 -yhttp://batch-cn.qiniudn.com/tool/ -thttp://batch-cn.qiniudn.com/list/tool.@version.txt
----------------------------------------------------------------------------------

搜索:

(任意位置匹配)直接输入sed,将采取任意位置匹配模式,之会列出下表

>>sed
====================================================
NAME                 YUM-SN VERSION                        SIZE DESCRIPTION
====================================================
csed                 [0332] @2003-09-13                    32KB 更小更快更轻量的sed
ESEDatabaseView      [0485] @nircmd,1.37                   94KB 读取并显示存储的可扩展存储引擎(ESE)数据库.edb文件中的数据(GUI)
minised              [0958] @1.12                          24KB 体积小巧的sed
onigsed              [1103] @4.15                         272KB 支持Oniguruma(ver.2.5.0)和Perl5正则表达式的sed
sed                  [1442] 4.0.7                          92KB 流文本处理工具(此版本换行不含回车符)
sed                  [1443] GnuWin32,4.2.1                672KB 流文本处理工具
sed                  [1444] 4.2.2                         150KB 流文本处理工具
sed                  [1445] msys2,4.2.2                  1468KB 流文本处理工具
sed                  [1446] 4.3                           204KB 流文本处理工具
sed                  [1447] @4.4                          203KB 流文本处理工具
sedsed               [1448] sedsed,1.0                   1609KB 强大的sed调试工具,Python脚本打包exe
sedsed               [1449] @pyinstaller,1.0             3873KB 强大的sed调试工具,pyinstaller打包exe
ssed                 [1534] @2.59                          81KB super_sed,支持Perl正则
tr                   [1675] @5.97                          26KB sed简化版
====================================================

下载:

(首位置匹配)输入^sed,会列出如下表,继续输入 :1446 下载对应的sed4.3版。

>>^sed:1446
====================================================
NAME                 YUM-SN VERSION                        SIZE DESCRIPTION
====================================================
sed                  [1442] 4.0.7                          92KB 流文本处理工具(此版本换行不含回车符)
sed                  [1443] GnuWin32,4.2.1                672KB 流文本处理工具
sed                  [1444] 4.2.2                         150KB 流文本处理工具
sed                  [1445] msys2,4.2.2                  1468KB 流文本处理工具
sed                  [1446] 4.3                           204KB 流文本处理工具
sed                  [1447] @4.4                          203KB 流文本处理工具
====================================================


原创开源

  1. /*
  2. THE FAST BCN TOOL, COPYRIGHT@2017~2019 BY HAPPY, VERSION 1.0
  3. FBCN.EXE
  4. -----------------------------------------------------------------

  5. _   _       _      _    |  The Batch Online Fast BCN Tool,
  6. \ | |     | \    / |   |  Copyright@2017~2019 By Happy, fbcn.exe
  7. \ \| |_   _| |\  /| |   |  Type "-h" for help.
  8. \_| | | | | | \/ | |   |
  9.    | | |_| | |\  /| |   |  Version 1.0 (2017-04-26 21:15 UTC)
  10.   _/ |\__'_|_| VV |_|   |  Officil http://www.bathome.net/thread-
  11. |__/                   |  43961-1-1.html

  12. -----------------------------------------------------------------
  13.                          .    .7     .,;;;::
  14.                          v;   7u      ..:;UMBM7::,,,.
  15.                          ;,   ;,    .       .BMsr7r7vL7r,
  16.                          ,    ,    ;0         ER7uuLLJ1SKKU;
  17.    .:xJx;.              .  ;      ;B.         .B7JSSu33FUPGRZL,
  18.        :uDBGs:.       :   .  :.rP..            BRiJaS11UHUHKOOOP;
  19.           :FMBRZJr.   PU.r7,MBMBM0;            uMU:LaaUFHGPHUKEORX:
  20.              7OMBMOPr.M1:MWRBOWMBBBMWi      31  BMx;71PaXKDEEP00WRBP:
  21.                ;3RBOsZX:sBOKUaWBMBBBMBMc,.:aM,  ;BOsrrJPXZEWORDDERRMR3
  22.                  .7rir,EMRDXRR3;rJRBBMBMa::.     xBELrr7UXEGGZDEDDWORMWi
  23.                    :  DMXBMBDu::.,:3OBBBBP:       JBKvrirx1KEWZZZEZKPRRRF:
  24.                   .,.GBuSRiLF3Us:.i:iDBMBMF        LBD7;ric2GDWEZ0EKXXWWRDJ
  25.                   irGBWURS.:1ZPEGc:. :MBMBM;        MBMrii;L2ZDOGZZEKDGWWOW0.
  26.                   :7BRaOBK. .sHPMU  ..aBBMBJ;::7x   .MBKir7:r3KDOEZED0ZZWDOWR:
  27.                   uLSZXBL. ,,i1ZMH ,,.sRRBMa::r7     BRMcii7:ruKDOZEDWEGEGDOGRr
  28.                  ,2EKxB7    , ;EB: .  vPBMBu         MMMJr;ir:iJKWOEDDOEWDGGOEOi
  29.                  JRBMRM      : 3P   ..;HRBBu        iBMB2ii;ii:;LZOOZGDGEODOWD0Dr
  30.                   :0GZu       :;; ..;ir1RMBF.r7    .BBBDBi:;;ii:;vEOWZOGDDOWWZZ0Dr
  31.                       :.      .r.;::.;7URBR0    .rKBMB2LMW::;iii:7JDODGOEWEWWOKE0W:
  32.                        .       . :   ,7PBMWZ;;uOBMBRBZr;cMK:;;;irr11WWODWDWGOOGZGKH
  33.                               .  .  ,:vDMRZMODMBMWMBRL:;:rGS::r277U0SODODWGWDODDE0FO
  34.                               c ..,:LrPMOSKOORBMXKBDLir:::;22:H    LKKWGWGWDOWWEDDPua
  35.                              .xr:::i:cRJsL1R0DMBEPXvir..:,..:7U:    3EZDGODWGOGWEWD7,3
  36.                              G: r   ,JWGxrOMDRRRRDOG1;7SWRBPHMBMBJ; ;KEPOGWDWDDGDZWs ::    7
  37.                             ;B: .   ;MWOaGRRMMGRRROBMBMBMBMBMBBBBBMBPSZPZDDOGOEDDZKU. c  .7B
  38.                            ;MM7 :.;,1; 7RBRORWRRBMRDBBBMMMRZZERMBMBMBUPXGGWGOWDGWPUUR1xJ:,.
  39.                            7MBi::r71r  .7ZOEBORMRMRGMMWBMWSKGRRRMBMBMK1ZZWEDDOZOZXJSMBWa0Xc   U:
  40.                            ;BBc.7r.s:  ;J1MORDMMBM0DBMMMBHEGMMBMBW0OBS1ZEGWEWEDDZHJaBMBMOMBMF:.:
  41.                          rvUMBM7:i:rKcxS1EMMWOWMOPGBMBO1RBMBMBRMMs :.rHGKWGDEDEEXK3URBMBMBMMMB7
  42.                          MMMBOBMOSucZMMORMBWRMWDRRBMO7   RBBBMRRB;   ,ZGZGODDKWPZHF..;c3WBBMMWBWa
  43.                          MMBMBMBMMJv;uMBBBMEDBMRu7Lcr     iRMBRBMB7Z . OKDGOZ0KKKPJ      ;2BMBZB0:
  44.                          MBMBMBE  ,:: .SBMBRMMBMWSL..        OBRBMBM  .OEKDGGPKXXH7        ,WMBO3M
  45.                        .0BMBMW:  :rr.    :OBBBORMBM7         rsOMBMO   :ZEZEKXXKUG,          RMMuBr
  46.                       ;PRBBMD   .i:         :FRMOMBM.        2MMBRO    ;EZDHZHZSHu           cBJRMU
  47.                     7OBBBBMX    i,          L7DBMBMR        :BMBMBZ    ;ZOZ0HXHH2.           ,.rMB;
  48.                   sMBBWHs:     :       ;iLaMH:ZOBMM        ZBMO7,OB    .OOEPHaPS:          . .7BBM
  49.             ,cJ7LXMBMs               ,rZuH3:.rMBB:       7MBBBD  .u    aWOXXSPXL          O. XMBM.
  50.            7BOBM0M2.                       cxOBM     7BMBMBBBJ        .GWZX1KO         ;.,a OMBR
  51.            :  :;,                  i7vSJrFMRMBWX     .L:Far           :OE0UaIF         .X ; OMBs
  52.                                   HMBMBMHMBML                         vEKSaZ;          R  iBBB.
  53.                                   v    Pai.                          .EESSQ          rr uBMr
  54.                                        .                             ;DHDF;           L WBR
  55.                                                                     .SRGA:          ::OBx
  56.                                                                     .;DX.          .WGB;
  57.                                                                     ;DW:          SGB.
  58.                                                                    ;SM           ;XZ;
  59.                                                                    :J            B;
  60.                                                                    :            ;
  61. */
  62. #include   <stdio.h>
  63. #include  <stdlib.h>
  64. #include  <string.h>
  65. #include <windows.h>
  66. #include <wininet.h>
  67. #include<shellapi.h>
  68. #include  <direct.h>
  69. #include   <conio.h>
  70. #include    <time.h>
  71. #include    <math.h>
  72. #include      <io.h>
  73. #pragma comment(lib, "wininet.lib")

  74. /*************宏量定义*************/
  75. #define SAFE_SIZE  512
  76. #define FILE_EXIST 0

  77. //定义帮助说明
  78. #define HELP_INFORMATION "\
  79. -----------------------------------------------------------------\n\
  80. fbcn -y[yumsrc] -t[tabsrc] -m[maxlist]\n\
  81. -----------------------------------------------------------------\n\
  82.      -h Show help information\n\
  83.      -y Set the yumsrc url\n\
  84.      -t Set the tabsrc url\n\
  85.      -m Set The max length of the list\n\
  86. -----------------------------------------------------------------\n\
  87. version 1.0\n"

  88. #define SEARCH_HEAD "\
  89. =====================================================================================================================\n\
  90. NAME                 YUM-SN VERSION                        SIZE DESCRIPTION\n\
  91. ====================================================================================================================="

  92. #define SEARCH_LOGO "\
  93. -----------------------------------------------------------------\n\
  94. \n\
  95. _   _       _      _    |  The Batch Online Fast BCN Tool,\n\
  96. \\ | |     | \\    / |   |  Copyright@2017~2019 By Happy, fbcn.exe\n\
  97. \\ \\| |_   _| |\\  /| |   |  Type "-h" for help.\n\
  98. \\_| | | | | | \\/ | |   |\n\
  99.    | | |_| | |\\  /| |   |  Version 1.0 (2017-04-26 21:15 UTC)\n\
  100.   _/ |\\__'_|_| VV |_|   |  Officil http://www.bathome.net/thread-\n\
  101. |__/                   |  43961-1-1.html\n\
  102. \n\
  103. -----------------------------------------------------------------\n"

  104. /*************全局变量*************/
  105. //主窗句柄
  106. HWND hWND=NULL;

  107. //OPT开关变量
  108. char* OPTARG;
  109. int OPTIND=1, OPTOPT;

  110. //分配表格容器
  111. static char tmpp[6][SAFE_SIZE]= {0};

  112. //分配缓存区、行容器
  113. static char tlist [SAFE_SIZE*SAFE_SIZE];
  114. static char LCache[SAFE_SIZE*2];

  115. //分配YUM-URL下载源
  116. static char yumsrcURL[SAFE_SIZE*2];
  117. static char tabsrcURL[SAFE_SIZE*2];

  118. //分配YUM序列容器
  119. static char yumSN[4];
  120. //分配YUM-URL容器
  121. static char yumURL[SAFE_SIZE*2];
  122. //Shell命令行容器
  123. static char shellTAI[SAFE_SIZE*2];

  124. //进度条变量
  125. static char proGRESS[64]= {0};
  126. clock_t preTime;
  127. ULONG preProgress;

  128. /*************类型定义*************/
  129. typedef HRESULT (WINAPI *PGETA)(LPUNKNOWN,LPCSTR,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);
  130. PGETA PgetUrlToFileA;

  131. extern "C" HWND WINAPI GetConsoleWindow();

  132. /*************功能函数*************/
  133. //子串查找忽略大小写
  134. const char* stristr(const char* str, const char* subStr)
  135. {
  136.         int len = strlen(subStr);
  137.         if(len == 0)
  138.         {
  139.                 return NULL;
  140.         }

  141.         while(*str)
  142.         {
  143.                 if(_strnicmp(str, subStr, len) == 0)
  144.                 {
  145.                         return str;
  146.                 }
  147.                 str++;
  148.         }
  149.         return NULL;
  150. }
  151. //光标函数
  152. BOOL DispyCursor(int size, BOOL mode)
  153. {
  154.         CONSOLE_CURSOR_INFO cinfo = {(DWORD)size, mode};
  155.         return SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cinfo);
  156. }
  157. //清屏函数
  158. int ShellCls()
  159. {
  160.         HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
  161.         CONSOLE_SCREEN_BUFFER_INFO csbi;
  162.         COORD coPos;
  163.         DWORD dwWritten;

  164.         if (GetConsoleScreenBufferInfo(hOutput, &csbi))
  165.         {
  166.                 coPos.X = 0;
  167.                 coPos.Y = 0;
  168.                 FillConsoleOutputAttribute (hOutput, csbi.wAttributes, csbi.dwSize.X*csbi.dwSize.Y, coPos, &dwWritten);
  169.                 FillConsoleOutputCharacterA(hOutput,              ' ', csbi.dwSize.X*csbi.dwSize.Y, coPos, &dwWritten);
  170.                 SetConsoleCursorPosition(hOutput, coPos);
  171.         }

  172.         return 0;
  173. }
  174. //获取第三方列表
  175. void GetWebSrcCode(const char *Url, char* tainer)
  176. {
  177.         *tainer='\0';
  178.         HINTERNET hSession = InternetOpen("zwt", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
  179.         if (hSession != NULL)
  180.         {
  181.                 HINTERNET hURL = InternetOpenUrl(hSession, Url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
  182.                 if (hURL != NULL)
  183.                 {
  184.                         char Temp[SAFE_SIZE*2] = {0};
  185.                         ULONG Number = 1;

  186.                         while (Number >0)
  187.                         {
  188.                                 InternetReadFile(hURL, Temp, SAFE_SIZE*2 - 1, &Number);
  189.                                 strncat(tainer, Temp, Number);
  190.                         }

  191.                         InternetCloseHandle(hURL);
  192.                         hURL = NULL;
  193.                 }
  194.                 InternetCloseHandle(hSession);
  195.                 hSession = NULL;
  196.         }
  197.         return;
  198. }
  199. //进度回调
  200. class DownloadProgress :public IBindStatusCallback
  201. {
  202. public:
  203.         HRESULT __stdcall QueryInterface(const IID &, void **)
  204.         {
  205.                 return E_NOINTERFACE;
  206.         }
  207.         ULONG STDMETHODCALLTYPE AddRef(void)
  208.         {
  209.                 return 1;
  210.         }
  211.         ULONG STDMETHODCALLTYPE Release(void)
  212.         {
  213.                 return 1;
  214.         }
  215.         HRESULT STDMETHODCALLTYPE OnStartBinding(DWORD dwReserved, IBinding *pib)
  216.         {
  217.                 return E_NOTIMPL;
  218.         }
  219.         virtual HRESULT STDMETHODCALLTYPE GetPriority(LONG *pnPriority)
  220.         {
  221.                 return E_NOTIMPL;
  222.         }
  223.         virtual HRESULT STDMETHODCALLTYPE OnLowResource(DWORD reserved)
  224.         {
  225.                 return S_OK;
  226.         }
  227.         virtual HRESULT STDMETHODCALLTYPE OnStopBinding(HRESULT hresult, LPCWSTR szError)
  228.         {
  229.                 return E_NOTIMPL;
  230.         }
  231.         virtual HRESULT STDMETHODCALLTYPE GetBindInfo(DWORD *grfBINDF, BINDINFO *pbindinfo)
  232.         {
  233.                 return E_NOTIMPL;
  234.         }
  235.         virtual HRESULT STDMETHODCALLTYPE OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed)
  236.         {
  237.                 return E_NOTIMPL;
  238.         }
  239.         virtual HRESULT STDMETHODCALLTYPE OnObjectAvailable(REFIID riid, IUnknown *punk)
  240.         {
  241.                 return E_NOTIMPL;
  242.         }
  243.         virtual HRESULT __stdcall OnProgress(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
  244.         {
  245.                 if (ulProgressMax != 0)
  246.                 {

  247.                         //进度百分数
  248.                         int downloadSpeed, restTime;
  249.                         int i=(int)ulProgress * 100.0 / (int)ulProgressMax;
  250.                         int j=i/2, disTime=(int)(clock()-preTime);
  251.                         if(disTime > 100)
  252.                         {
  253.                                 downloadSpeed=((int)ulProgress-(int)preProgress) * CLOCKS_PER_SEC / disTime / 1000;
  254.                                 restTime=(downloadSpeed!=0) ?((int)ulProgressMax-(int)ulProgress) / downloadSpeed :99999;
  255.                                 preProgress=ulProgress, preTime+=disTime;
  256.                         }
  257.                         else if(i <100)
  258.                         {
  259.                                 return S_OK;
  260.                         }

  261.                         if(i==100)
  262.                         {
  263.                                 downloadSpeed=restTime=0;
  264.                         }

  265.                         for(int n=1; n<=j; n++)
  266.                         {
  267.                                 proGRESS[n]='=';
  268.                         }

  269.                         //显示进度百分比
  270.                         fprintf(stdout, "\r%s%3d%% %3dKB/s,%3dm%02ds ", proGRESS, i, downloadSpeed, restTime/1000/60, restTime/1000%60);
  271.                         fflush(stdout);
  272.                 }
  273.                 return S_OK;
  274.         }
  275. };
  276. //开关解析
  277. int GetOpt(int nargc, char *nargv[], char *ostr)
  278. {
  279.         static char* place="";
  280.         static char* lastostr=(char *) 0;
  281.         register char* oli;
  282.         char* index();
  283.         if(ostr!=lastostr)
  284.         {
  285.                 lastostr=ostr;
  286.                 place="";
  287.         }
  288.         if(!*place)
  289.         {
  290.                 if(
  291.                     (OPTIND>=nargc)              ||
  292.                     (*(place=nargv[OPTIND])!='-')||
  293.                     (!*(++place))
  294.                 )
  295.                 {
  296.                         place="";
  297.                         return(EOF);
  298.                 }
  299.                 if (*place == '-' && place[1] == 0)
  300.                 {
  301.                         ++OPTIND;
  302.                         return(EOF);
  303.                 }
  304.         }
  305.         if ((OPTOPT=(int)*place++)==(int)':' || !(oli=strchr(ostr, OPTOPT)))
  306.         {
  307.                 if(!*place)
  308.                 {
  309.                         ++OPTIND;
  310.                 }
  311.         }

  312.         if (oli != NULL && *(++oli) != ':')
  313.         {
  314.                 OPTARG=NULL;
  315.                 if(!*place)
  316.                 {
  317.                         ++OPTIND;
  318.                 }
  319.         }
  320.         else
  321.         {
  322.                 if(*place)
  323.                 {
  324.                         OPTARG=place;
  325.                 }
  326.                 else if(nargc<=++OPTIND)
  327.                 {
  328.                         place="";
  329.                 }
  330.                 else
  331.                 {
  332.                         OPTARG=nargv[OPTIND];
  333.                 }
  334.                 place="";
  335.                 ++OPTIND;
  336.         }
  337.         return(OPTOPT);
  338. }
  339. //搜索函数
  340. int SearchStr(const char* tblist, const char* key, int maxLIST, int ynum)
  341. {
  342.         BOOL kMARK=TRUE;
  343.         int  i=0, count=0, mode=0, kl=strlen(key);
  344.         char* keywords=NULL;

  345.         if(*key!='^' && *key!=0 && *(key+1)=='\0')
  346.         {
  347.                 mode=1;
  348.                 keywords=(char*)key;

  349.         }
  350.         else if(*key=='^' && *(key+1)!='\0')
  351.         {
  352.                 mode=2;
  353.                 keywords=(char*)key+1;

  354.         }

  355.         else if(*key!='^' && *key!='\0')
  356.         {
  357.                 mode=4;
  358.                 keywords=(char*)key;
  359.         }

  360.         if(ynum>0)
  361.         {
  362.                 mode=5;
  363.                 keywords=(char*)key;
  364.         }

  365.         //辅助行指针
  366.         char* Line=NULL;
  367.         char* p=(char*)tblist;

  368.         //重置列表容器
  369.         tlist[0]='\0';
  370.         char* strliu=tlist;

  371.         while(*p)
  372.         {
  373.                 char* tp=LCache;
  374.                 while(*p!='\n' && *p!='\0')
  375.                 {
  376.                         *tp++=*p++;
  377.                 }
  378.                 if(*p=='\n')
  379.                 {
  380.                         p++;
  381.                 }
  382.                 *tp='\0';

  383.                 //指针置换
  384.                 Line=LCache;

  385.                 //过滤行TAB缩进或前空格
  386.                 while(*Line=='\t'|| *Line==' ')
  387.                 {
  388.                         Line++;
  389.                 }

  390.                 if(kMARK)
  391.                 {
  392.                         if(stristr(Line, "Rem ")==Line)
  393.                         {
  394.                                 kMARK=FALSE;
  395.                                 continue;
  396.                         }
  397.                 }

  398.                 if(!kMARK || *Line=='\0')
  399.                 {
  400.                         continue;
  401.                 }

  402.                 i++;

  403.                 if(
  404.                     (mode==5 && i==ynum)                                        ||
  405.                     (mode==1 && *keywords==*Line)                               ||
  406.                     (mode==2 && stristr(Line, keywords)==Line)                  ||
  407.                     (mode==4 && stristr(Line, keywords))
  408.                 )
  409.                 {
  410.                         char* textstrp=NULL;

  411.                         if(textstrp=strtok(Line, " "))
  412.                         {
  413.                                 strcpy(tmpp[0], textstrp);
  414.                         }

  415.                         for(int j=1; j<5; j++)
  416.                         {
  417.                                 if(textstrp=strtok(NULL, " "))
  418.                                 {
  419.                                         strcpy(tmpp[j], textstrp);
  420.                                 }
  421.                                 else
  422.                                 {
  423.                                         tmpp[j][0]=0;
  424.                                 }
  425.                         }

  426.                         if (mode==5 && i==ynum)
  427.                         {
  428.                                 //进度回调入口
  429.                                 DownloadProgress progress;
  430.                                 IBindStatusCallback* callback=(IBindStatusCallback*)&progress;

  431.                                 //进度归零
  432.                                 memset(proGRESS, ' ', 51);
  433.                                 proGRESS[0]='[', proGRESS[51]=']';

  434.                                 preTime=clock();
  435.                                 preProgress=(ULONG)0;

  436.                                         strcpy(yumURL, yumsrcURL);
  437.                                         strcat(yumURL, (tmpp[1][0]=='@')?tmpp[1]+1:tmpp[1]);
  438.                                         strcat(yumURL, "/");
  439.                                         strcat(yumURL, tmpp[0]);


  440.                                 if(stricmp(strrchr(yumURL, '.'), ".rar"))
  441.                                 {
  442.                                         strcat(yumURL, ".exe");
  443.                                 }

  444.                                 //清除IE缓存
  445.                                 DeleteUrlCacheEntryA(yumURL);

  446.                                 //调用下载函数
  447.                                 if (PgetUrlToFileA(NULL, yumURL, strrchr(yumURL, '/')+1, 0, static_cast<IBindStatusCallback*>(&progress)) != S_OK)
  448.                                 {

  449.                                         //进度归零
  450.                                         memset(proGRESS, ' ', 51);
  451.                                         proGRESS[0]='[', proGRESS[51]=']';

  452.                                         preTime=clock();
  453.                                         preProgress=(ULONG)0;

  454.                                 strcpy(yumURL, yumsrcURL);
  455.                                 strcat(yumURL, tmpp[0]);

  456.                                         if(stricmp(strrchr(yumURL, '.'), ".rar"))
  457.                                         {
  458.                                                 strcat(yumURL, ".exe");
  459.                                         }
  460.                                         //清除IE缓存
  461.                                         DeleteUrlCacheEntryA(yumURL);

  462.                                         if (PgetUrlToFileA(NULL, yumURL, strrchr(yumURL, '/')+1, 0, static_cast<IBindStatusCallback*>(&progress)) != S_OK)
  463.                                         {
  464.                                                 fprintf(stdout, "DOWNLOAD "%s" ERROR.", tmpp[0]);
  465.                                                 Sleep(2800);
  466.                                                 return 0;
  467.                                         }
  468.                                         else
  469.                                         {
  470.                                                 fprintf(stdout, "DOWNLOAD "%s" SUCCEED.", tmpp[0]);
  471.                                         }
  472.                                 }
  473.                                 else
  474.                                 {
  475.                                         fprintf(stdout, "DOWNLOAD "%s" SUCCEED.", tmpp[0]);
  476.                                 }

  477.                                 if(!stricmp(strrchr(yumURL, '.'), ".rar") && _access("unrar.exe", FILE_EXIST)==0)
  478.                                 {
  479.                                         strcpy(shellTAI, "x -o+ -y ");
  480.                                         strcat(shellTAI, tmpp[0]);
  481.                                         ShellExecuteA(hWND, "runas", "unrar.exe", shellTAI, "", SW_NORMAL);
  482.                                 }

  483.                                 return 0;
  484.                         }

  485.                         if (mode==5)
  486.                         {
  487.                                 continue;
  488.                         }

  489.                         //打印搜索结果到字符流容器中
  490.                         sprintf(strliu, "%-20.20s [%04d] %-25.25s %7dKB %s\n", strtok(tmpp[0], "."), i, tmpp[1], atoi(tmpp[3])/1024, tmpp[2]);

  491.                         while(*strliu)
  492.                         {
  493.                                 strliu++;
  494.                         }

  495.                         count++;

  496.                         if(count>maxLIST)
  497.                         {
  498.                                 break;
  499.                         }
  500.                 }

  501.         }

  502.         if(mode==5)
  503.         {
  504.                 fprintf(stdout, "DOWNLOAD "[%d]" ERROR.", ynum);
  505.                 Sleep(2800);
  506.         }

  507.         //一次抛出字符流
  508.         fprintf(stdout, "%s\n", tlist);

  509.         //刷新输出缓存区
  510.         fflush(stdout);

  511.         return 0;
  512. }

  513. /*************MAIN函数*************/
  514. int main(int argc, char** argv)
  515. {
  516.         if(argc<2)
  517.         {
  518.                 //无参数则退出
  519.                 fprintf(stdout, HELP_INFORMATION);
  520.                 exit(0);
  521.         }

  522.         int flag[2]= {0}, K, maxLISTSIZE=25;
  523.         while((K=GetOpt(argc,argv,"hy:t:m:"))!=-1)
  524.         {
  525.                 switch(K)
  526.                 {
  527.                 case 'h':
  528.                 case 'H':
  529.                         fprintf(stdout, HELP_INFORMATION);
  530.                         exit(0);

  531.                 case 'y':
  532.                 case 'Y':
  533.                         if(OPTARG !=NULL)
  534.                         {
  535.                                 strcpy(yumsrcURL, OPTARG);
  536.                                 flag[0]=1;
  537.                         }
  538.                         break;

  539.                 case 't':
  540.                 case 'T':
  541.                         if(OPTARG !=NULL)
  542.                         {
  543.                                 strcpy(tabsrcURL, OPTARG);
  544.                                 flag[1]=1;
  545.                         }
  546.                         break;

  547.                 case 'm':
  548.                 case 'M':
  549.                         if(OPTARG !=NULL)
  550.                         {
  551.                                 maxLISTSIZE=atoi(OPTARG);
  552.                         }
  553.                         break;

  554.                 default:
  555.                         fprintf(stdout, "Unknown switch '-%c'\n", K);
  556.                         exit(1);
  557.                 }
  558.         }

  559.         if (!flag[0])
  560.         {
  561.                 fprintf(stdout, "Needs yumsrc URL.\n");
  562.                 exit(1);
  563.         }

  564.         if (!flag[1])
  565.         {
  566.                 fprintf(stdout, "Needs tabsrc URL.\n");
  567.                 exit(1);
  568.         }

  569.         //分配内存容器
  570.         char* tblist=(char*)malloc(SAFE_SIZE * SAFE_SIZE*2);

  571.         //读取列表文件
  572.         fprintf(stdout, SEARCH_LOGO);
  573.         GetWebSrcCode(tabsrcURL, tblist);
  574.         if(!(*tblist))
  575.         {
  576.                 fprintf(stdout, "Get batch-cn-list failed.\n");
  577.                 exit(1);
  578.         }
  579.         Sleep(30);

  580.         //装载DLL模块
  581.         HMODULE hLib=LoadLibraryW(L"URLMON");
  582.         if(hLib==NULL)
  583.         {
  584.                 fprintf(stdout, "ERROR");
  585.                 return 1;
  586.         }
  587.         //过小红伞本地查杀
  588.         PgetUrlToFileA=(PGETA)GetProcAddress(hLib, "URLDownloadToFileA");

  589.         //获取控制台输出句柄
  590.         HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

  591.         //隐藏光标
  592.         CONSOLE_CURSOR_INFO cinfo = {(DWORD)25, FALSE};
  593.         SetConsoleCursorInfo(hOutput, &cinfo);

  594.         //设置屏幕缓存区大小
  595.         COORD csi= {SAFE_SIZE, SAFE_SIZE};
  596.         SetConsoleScreenBufferSize(hOutput, csi);

  597.         hWND=GetConsoleWindow();

  598.         //清屏
  599.         ShellCls();

  600.         //分配输入字符容器
  601.         unsigned char str[SAFE_SIZE]= {0};

  602.         //字符下标
  603.         int i=-1, k=0;

  604.         //打印界面头部
  605.         fprintf(stdout, ">>%s\n%s\n", str, SEARCH_HEAD);

  606.         //开始主循环
  607.         while(TRUE)
  608.         {
  609.                 //如果按下按键
  610.                 if(kbhit())
  611.                 {
  612.                         //获取键值
  613.                         k=getch();

  614.                         if(k=='\r')
  615.                         {
  616.                                 continue;
  617.                         }

  618.                         //如果键值属于ASCII码
  619.                         if(0<k && k<0x80)
  620.                         {
  621.                                 //如果输入冒号
  622.                                 if(k==':')
  623.                                 {
  624.                                         //光标回到输入字符串身后
  625.                                         COORD nsi= {2+strlen((const char*)str),0};
  626.                                         SetConsoleCursorPosition(hOutput, nsi);
  627.                                         fputc(':', stdout);

  628.                                         //开始接受4个编号数字
  629.                                         for(int nu=0; nu<4; nu++)
  630.                                         {
  631.                                                 yumSN[nu]=getch();
  632.                                                 fputc(yumSN[nu], stdout);
  633.                                         }

  634.                                         //调用下载函数
  635.                                         SearchStr((const char*)tblist, (char*)str, maxLISTSIZE, atoi(yumSN));

  636.                                 }
  637.                                 else if(k!='\b')
  638.                                 {
  639.                                         //如果是字符,则入栈
  640.                                         str[++i]=k;
  641.                                 }
  642.                                 else if(i>=0)
  643.                                 {
  644.                                         if(str[i]<0x80)
  645.                                         {
  646.                                                 //如果是删除字符
  647.                                                 str[i--]=0;
  648.                                         }
  649.                                         else
  650.                                         {
  651.                                                 //如果是删除汉字
  652.                                                 str[i--]=0;
  653.                                                 str[i--]=0;
  654.                                         }
  655.                                 }
  656.                         }
  657.                         else if(str[i]<0xFE)
  658.                         {
  659.                                 //如果是汉字,则入栈
  660.                                 str[++i]=k;
  661.                                 str[++i]=getch();
  662.                         }

  663.                         //清屏
  664.                         ShellCls();

  665.                         //输出界面头部
  666.                         fprintf(stdout, ">>%s\n%s\n", str, SEARCH_HEAD);

  667.                         if(i>=0)
  668.                         {
  669.                                 //查询关键词
  670.                                 SearchStr((const char*)tblist, (char*)str, maxLISTSIZE, -1);
  671.                                 //查询完毕,光标回首
  672.                                 COORD gsi= {0,0};
  673.                                 SetConsoleCursorPosition(hOutput, gsi);
  674.                         }

  675.                 }

  676.                 //降低CPU占用率
  677.                 Sleep(1);
  678.         }

  679.         //释放查询表内存
  680.         free(tblist);

  681.         return 0;
  682. }
复制代码

评分

参与人数 1技术 +1 收起 理由
freesoft00 + 1 +1

查看全部评分

发表于 2017-4-28 02:07:53 | 显示全部楼层
centos 下的有叫yum的了。换个名字啦。

评分

参与人数 1技术 +1 收起 理由
happy886rr + 1 考虑周道,我正在想新名字。

查看全部评分

发表于 2017-4-29 10:48:37 | 显示全部楼层
添加了新的第三方怎么办?我们是按名称排序的,所以都是插到中间,那SN会不会变?
 楼主| 发表于 2017-4-29 12:51:51 | 显示全部楼层
本帖最后由 happy886rr 于 2017-4-29 13:00 编辑

回复 3# CrLf
这个每次都会先请求http://batch-cn.qiniudn.com/list/tool.@version.txt 的数据,放入内存,自动分配YUM-SN编号,  全部内存中查找,所以你更新了,这个也会重新分配编号。不过这不影响使用,这个你直接输入关键字,马上就显示出最新的YUM-SN编号。主要是提供一种命令行下的,快速检索、快速下载、快速安装体验。

应该给  tool.@version.txt再加一列,就是给每个第三方弄个ID号,这样才方便管理,通过独有的4位ID码就知道我本地已经下载了哪个版本的sed,用独有的ID号去记录本地包的安装、更新、删除。 否则,就得看后边的版本号,鉴于目前版本号格式很不统一,所以很有必要弄个ID码去识别到底是哪个版本。
  1. sed                  [1443] GnuWin32,4.2.1                672KB 流文本处理工具
  2. sed                  [1444] 4.2.2                         150KB 流文本处理工具
  3. sed                  [1445] msys2,4.2.2                  1468KB 流文本处理工具
  4. sed                  [1446] 4.3                           204KB 流文本处理工具
  5. sed                  [1447] @4.4                          203KB 流文本处理工具
复制代码
不过最棘手的是下载地址使用版本号做的文件夹,这样非常不统一,服务器上应该只放编号文件。比如1444.exe、1445.exe、1446.rar。下载到本地,根据version.txt查ID表再还原为原始文件名sed.exe。
或者全部弄成zip压缩包:1444.zip,1445.zip,1446.zip。每个zip包里可以加入使用说明文件、来源,这样才是真正的第三方包模式。程序只要下载一个1444.zip,解压exe文件即可。
发表于 2017-4-29 22:47:32 | 显示全部楼层
bcn.bat路过
发表于 2017-4-29 23:25:29 | 显示全部楼层
本帖最后由 CrLf 于 2017-4-30 22:00 编辑

回复 4# happy886rr


    因 Batch-CN 完全依赖七牛云静态存储,所以无法用 php 进行引导,为了兼容尽量多的使用方式和简化使用逻辑,所以第三方工具均以本名储存,fbcn的出现我们是很欢迎的,但是有些建议:
1、是否能完成自我更新,而且在未来是否能保证持续地及时更新?(bcn曾也想用c语言写就,但出于种种考虑直接用了js库,这样可以在多端上无缝同步更新)
2、建议加入缓存机制和智能判断是否需要下载,避免频繁访问七牛云(每月有访问次数和流量限制,之前超出的部分是我们自掏腰包撑着)
3、yumsn既然不恒定,那使用场景似乎大受约束,我能想到的场景更多见的应该是在命令行搜索出一堆匹配结果后,再精确下载某一版本的文件,而yumsn并不能区分版本,此时反倒是根据12345的自然序号进行二次选择来得更实用
最后,楼主是否愿意加入我们,成为Batch-CN的第四位维护者?

评分

参与人数 3技术 +3 收起 理由
freesoft00 + 1 +1
老刘1号 + 1 666
codegay + 1 1

查看全部评分

发表于 2017-4-30 20:12:13 | 显示全部楼层
回复 6# CrLf


    几位管理兄弟为了论坛也是拼了,
感动ing……
这个论坛能做这么好也多亏了你们啊
发表于 2017-4-30 20:18:10 | 显示全部楼层
回复 7# 老刘1号


    没花多少,总共用了不到100块吧,大头是论坛这边,没有 Batcher 就没有论坛了

评分

参与人数 2技术 +2 收起 理由
bbaa + 1 支持
老刘1号 + 1 维护不易,精神可嘉!

查看全部评分

 楼主| 发表于 2017-4-30 23:19:49 | 显示全部楼层
本帖最后由 happy886rr 于 2017-4-30 23:30 编辑

回复 6# CrLf
哈哈,非常乐意加入你们,不过我只会C语言,我就负责C版本吧,我已经写出了雏形,windows下的yum,用起来很棒http://www.bathome.net/thread-43980-1-1.html。不过七牛云的目录结构太杂了,yum的很多特殊功能无法对接实现。这个跟linux下的yum很接近了,要想一模一样,需要云目录的大规模修改,由于七牛云不全免费,我打算弄个200M的单机yum,包含70%的BCN命令。常用的exe都挺小全打包才200M,但一些python,perl的压缩包都是精简的功能缺失太厉害,所以就不集成了。

比如yum install s*安装s开头的所有包,我都实现了,理论上只要云端编号合理,我会将88%的yum功能搬到windwos下。
发表于 2017-4-30 23:58:29 | 显示全部楼层
本帖最后由 CrLf 于 2017-5-1 00:16 编辑

回复 9# happy886rr


    我构想的实现途径是新增一个专供yum的txt,包含具体链接和其他信息,反正Batch-CN项目已经是自动化生成列表并上传,多一个txt,每次更新的工作量并不会增加
    至于版本号导致的路径复杂…这个嘛,其实gnu官方库的文件名也是带版本号的
    我们的逻辑是有同名则必须以文件夹区分版本号,无同名则直接引用
发表于 2017-5-1 14:12:51 | 显示全部楼层
Github 的清点对象算法
http://www.ruanyifeng.com/blog/2015/09/git-bitmap.html

不知道你们看了是不是会有灵感启发。
 楼主| 发表于 2017-5-1 14:41:22 | 显示全部楼层
回复 11# codegay
算法相当棒,但是bcn才2000个文件,而且第三方的增长速度越来越慢,新的第三方被找到的可能性也越来越低。
 楼主| 发表于 2017-5-1 14:54:58 | 显示全部楼层
回复 10# CrLf 一个txt就解决问题了,只需要给他们一个固定的身份证ID,有了这个ID我就知道本地安装的是哪个版本的sed,否则你很难通过sed.exe的名字判断你安装的是哪个版本。后收录的其ID号就会大于之前收录的,根据ID号的增加,程序就能自动推送可用的更新。云目录还保持原有结构,只要能给每个exe弄个身份证号,就方遍yum管理了。还有很多第三方只是个exe,连具体的使用说明也没,yum后续会自动从src捕获使用教程并补充之。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-16 22:02 , Processed in 0.027480 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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