批处理之家's Archiver

CrLf 发表于 2014-6-18 18:20

HASH.exe 批量获取文件的 HASH 信息(20170214更新)

原本只是为了实现文件查重,但后来成了消遣,功能越加越杂...
已升级到 3.0 版本,内码统一为 Unicode(UTF-16),正则引擎改用 PCRE2,并增加了 /DO /DOUNTIL 等强大的开关
[url]http://bcn.bathome.net/s/tool/index.html?key=HASH[/url]
[attach]10413[/attach]源码很怂,专家莫笑

编译参数:[code]tcc.exe HASHw2.encode.c -w -Wl,--stack=268435455 -DPCRE2_CODE_UNIT_WIDTH=16 libpcre16_compile_exec_tcc2.a -I .\pcre2-10.20 -o .\HASH.exe[/code]重新整合新版测试包,全面测试各块功能:
“hash示例.bat”用于粗略测试主要功能
“各开关测试”文件夹用于详细地单独测试各个开关的执行效果,代码中有注释,也算是示例吧
--------------------------------------------------------------------------------------------------
[quote]hash version 3.1.6  批量获取文件的 HASH 信息  by CrLf [bbs.bathome.net]

hash.exe [drive:][path][filename][/Pattern/[Options],...]
         [/D:[Path]] [/S[:Range]] [/G]

         [/STRING [String[/Pattern[Options]]]
         [/#] [/SHIFT] [/RE]]

         [/N[:Range]] [/CRC32[:String]] [/MD5[:String]] [/SHA1[:String]]
         [/A[:Att]] [/Z[:Range]]]

         [/PRINTF|/DO|DOUNTIL:Format[,Key,...]] [/CSV] [/NH]
         [/DO:Format[,Key,...]] [/DOUNTIL:Format[,Key,...]]
         [/UCASE] [/HIDE] [/RELATIVE] [/X]

         [/SAMPLE:[:Step | -MaxCycle]] [/RETURN] [/HELP] [/ALIAS]
         [/VERSION[:Version]] [/DEBUG[:Name|:=Value]] [//]


  [drive:][path][filename]
              指定要列出的驱动器、目录和文件名

               X:\path\filename[/Pattern/[Options]]

              通用的 Options 如下(PCRE 原生支持):
               i 忽略大小写         x 忽略空格与以#开头的注释
               u 非贪婪模式         8 UTF-8 模式
               m 多行替换           s . 可以匹配换行符
               f 匹配首行

              以下三种 Options 仅在 /STRING 的扩展选项中生效:
               ~ 去除前后空格     + 跳过全空行
               g 允许多次匹配

              以下三种 Options 仅能用于 filename 或 string 的正则:
               . 匹配时含后缀名   : 匹配路径(默认只匹配文件名)
               ! 条件取反

              例1,匹配文件名含 A 的 exe 文件:

               hash *.exe/A/i

              例2,匹配后缀名不为 exe 的文件:
               hash */\.exe$/.!

              例3,匹配后缀名为 exe 或 txt 的文件:
               hash */\.exe$^|\.txt/.!
               rem 代码中的 ^ 用于在批处理中将 | 转义

              程序结束时,如果始终没有匹配项,退出码置为 -1

  /D[:Path]   在输出的结果中包含文件夹,扩展参数可以切换工作路径到 Path
              若将 : 写成 ::,/D 将不影响输出,但 Path 设置仍生效

  /S[:Min~Max]
              显示指定目录和所有子目录中的文件
               Min~Max 能筛选出 Min < 递归深度 < Max 的文件
              可以用 /S:Min 或 /S:~Max 单独设置上限或下限

  /G[:Charset]
              将参数理解为文件列表或字符串列表,逐行读取
              列表中指向的文件无法使用正则筛选和遍历子目录,但仍可以使用通配符
              根据文件头自动判断编码格式,扩展参数可以设置无 BOM 的文件的默认编码

              支持的 Charset 和记事本一致,支持以下四种选项:
               ANSI    UNICODE    UNICODE-BE    UTF-8

* /STRING[:/Pattenr/[Options],... |:s/Pattenr/String2/[Options],...]
              参数视为字符串,扩展选项为一条或多条正则,用于捕获或替换:
               /String:/Pattern/[Options] 捕获每个字符串中首个匹配的内容,如:

               hash /string:/(?^<=\.)\w+/i "bbs.bathome.net"
               rem 此处的 ^ 仅用于在批处理中将 < 转义
               rem 以 /(?<=\.)\w+/ 为条件对 bbs.bathome.net 进行匹配
               rem 将捕获到 "bathome"

               /STRING:s/Pattern/String2/[Options] 将对匹配的结果进行替换,如:

               hash /string:s/.*\.(.+)\..*/\1/i "bbs.bathome.net"
               rem 会把捕获的部分替换成第一个括号中引用的内容

              使用大写的 S 标记将会反复替换直到结果不再变化:

               hash /string:S/\wb/b/i "bbsbathome"
               rem 可以实现对匹配过的内容再次匹配,直到找不到匹配内容
               rem 使用 S 模式可能会因为替换结果仍符合匹配条件而产生死循环

              可以多次替换或捕获,只要将正则表达式用 ; 号分隔:

               hash /string:s/.*?\.//;s/\..*?$/ "bbs.bathome.com"
               rem 先执行 s/.*?\.// 再执行 s/\..*?$/,然后输出结果
               rem replace 可以和 match 正则联用

              正则基于 PCRE 库,Options 说明见前文,String2 中可用 \s 表示空格
              \0 表示 Pattern 匹配的全部内容,\1~\9 表示 () 引用的内容
              若将 : 写成 ::,/STRING 将作用于文件名,而不将参数理解为字符串
              此时正则只针对输出结果中的文件名或路径

  String      启用 /STRING 后,非开关的参数都视为字符串
              同样支持用如下格式的正则表达式对字符串进行筛选,
               String[/Pattern/[Options]]  (Options 说明见前文)

  /#          /STRING 模式中可设置 # 为注释符,启用后将忽略空格与以#开头的注释
              还可用以下开关启用其他注释符(仅一个生效): /` /' /; /: /:: ///
              /# 优先级高于 /SHIFT 和 /RE,因此仅字符串中原有的注释符有效

  /RE         解释参数中的正则元字符,启用后将参数中的对部分元字符转义:

               \\=\ \a={响铃符}  \b={退格符} \f={换页符} \n={换行符}
               \r={回车符} \t={水平制表符} \v={垂直制表符} \s={空格} \0={NULL}
               \xNN={2位十六进制所代表的任意字符,如 \x41=A}
               \cX={c@ ~ c_ 对应 0x0 ~ 0x1F 任意控制字符}

  /SHIFT      映射参数中的字符,把参数中 $ 之后的第一个字符映射为同键字符
              启用后,$ 的作用类似于 SHIFT 键,如 $a=A $'=" $1=!
              /SHIFT 与 /RE 开关对以下内容起作用:
               FileName  String  各开关扩展参数  正则Pattern  正则Replacement

* /N[:SCOPE | :Min~Max[=Scope]]
              显示行号
              Scope 指定计数周期,有如下可选项(可简写为首字母):

               Bin 二进制周期  Oct 八进制周期  Dec 十进制周期  Hex 十六进制周期
               Global 全局     Arg 命令行参数  List 文件列表   Folder 每个文件夹

              Min~Max 能筛选出 Min < 行号 < Max 的字符串或文件,
              可以用 /N:Min 或 /N:~Max 单独设置上限或下限
              若将 : 写成 ::,Size 将不被显示,但筛选条件仍生效

* /CRC32[:String]
              计算 CRC32 值,可用扩展参数指定只显示 CRC32 值为指定值的项
              若将 : 写成 ::,CRC32 值将不被显示,但筛选条件仍生效

* /MD5[:String]
              计算 MD5 值,可用扩展参数指定只显示 MD5 值为指定值的项
              若将 : 写成 ::,MD5 值将不被显示,但筛选条件仍生效

* /SHA1[:String]
              计算 SHA1 值,可用扩展参数指定只显示 SHA1 值为指定值的项
              若将 : 写成 ::,SHA1 值将不被显示,但筛选条件仍生效

* /A[:Att[Att]...]
              显示文件/文件夹的属性,对字符串无效。缩写字母的含义如下:

               d 目录   r 只读   a 存档   h 隐藏   s 系统
               c 压缩   o 脱机   i 无索引 l 链接   e 加密

              可以用扩展选项筛选文件属性,- 号表示排除此类型
              如未使用 /A 开关及其扩展参数,则默认为 /A::-d-h-s
              同时启用 /F /STRING 与 /A 开关时,此值为文件的名称或路径
              若将 : 写成 ::,属性将不被显示,但筛选条件仍生效

* /Tx[:FORMAT | :Min~Max[=Format]]
              Tx 代表显示文件的时间属性(仅能指定一种):
               /TC 创建时间 /TA 上次访问时间 /TW 上次写入时间

              扩展参数可指定范围,Min~Max 能筛选出 Min < 文件日期 < Max 的文件
              可以用 /Tx:Min 或 /Tx:~Max 单独设置上限或下限
              支持常见日期格式,并能进行增减计算,格式为:
               DateTime[[ + | - ]Number[Type]]

              + 为增加,- 为减少,Number 为数量,Type 为单位
              可选的 Type 有:w(周) d(日[默认]) h(时) m(分) s(秒)

               hash *.txt /tw:12:00-5
               rem 列举所有 5天前的12:00 之后修改的 txt 文件
               hash /tc:9:00-10d+12h
               rem 列举所有 10天前的9:00再加12个小时 之后创建的文件

              如果同时明确指定了 Min 与 Max,则会用当前时间自动补充未指定的部分
              将日期补全之后,才会进行日期增减计算
              若日期前缀 * 符号,则会优先用另一半补充未指定的部分如:

               hash /tw:"7/29 0:0"~*8:00
               rem 列举从今年 07/29 00:00 到 同一天的08:00 之间修改的文件

              若参数中含有 % 号,将理解为设置日期显示格式
              日期格式语法参考 strftime 函数,如:

               hash /tw:%Y年%m月%d日
               hash /printf:"%s修改于%s\n",file,tw:"%H时%M分%S秒"

              如果要用一个 /tx 同时指定日期范围与显示格式
              可以用 = 符号表示其后内容为日期格式:

               hash /tc:"00:00+12h"="%y年第%W周"

* /Z[:Unit | :Min~Max[=Unit]]
              显示文件的长度或文件夹中的成员数量
              Unit 指定长度单位,有如下可选项:

               bit Byte KB MB GB TB PB Chars

              Chars 用于计算字符串中的字符数而非字节数
              可使用首字母简写,但简写时 b 与 B 区分大小写

              Min~Max 能筛选出 Min < 长度 < Max 的字符串或文件,
              可以用 /Z:Min 或 /Z:~Max 单独设置上限或下限
              若将 : 写成 ::,Size 将不被显示,但筛选条件仍生效

  /PRINTF:Format[,Key[,..]]
              用 PRINTF 支持的格式输出各项,可用的 Key 有(支持别名):

               number  crc32  md5  sha1  attrib  time  size  file|string

              最多能指定 20 个 Key 来指示各项信息出现的顺序,Key 与同名开关等价
              名字相同的 Key 共用扩展参数,新的扩展参数会替代原有设置
              若指定了 Key,则使用 Key 的顺序,帮助中前缀 * 的开关都将失效
              未指定 Key 将使用上表顺序,而与开关出现的顺序无关
              所以下面三条命令是等价的:

               hash /printf:"%03d %s %10d %s\n" /size /num /attrib
               hash /printf:"%03d %s %10d %s\n" /size /attrib /num
               hash /printf:"%03d %s %10d %s\n",num,attrib,size,file

              可以用类似的方法模拟 LIST 格式输出:

               hash /printf:"NAME=%s\nSIZE=%d\nMD5=%s\n\n",file,size,md5 *

              对 size 和 number 可选 %d %x %o %u 类型,余项只能使用 %s 类型
              file 表示文件,与 string 互斥,但共用 /STRING 的扩展参数
              另有四个内置参数 @name @path @is @when,并各自带扩展参数

              @name 表示参数为文件名
              支持以下扩展参数(其中 base 与 ext 也可用于字符串)

               short 短名     long  长名     full  全名     parent 父目录名
               base  基本名   ext   扩展名

              @path 表示参数为路径,支持以下扩展参数:

               short 短路径   long  长路径   full  全路径   parent 父目录路径
               root  根路径

              @is 表示判断属性
              必须指定以下扩展参数之一,其中 empty 也可用于字符串:

               folder   文件夹               file   文件
               readonly 只读                 hidden 隐藏
               empty    为空

              @when 表示获取相应修改时间
              支持以下扩展参数:(用于字符串时为当前时间):


               create 创建     access 访问  write 写入

              带 @ 的开关仅用于 format,且独立于其他开关,例如:

               hash /printf:"创建于%s,扩展名%s\n",@when:create,@name:ext"
               rem 显示文件的修改时间和后缀名
               rem 使用 @when 时日期格式固定,但有更好的兼容性

  /DO:Format[,Key,...]
  /DOUNTIL:Format[,Key,...]
              语法和 /PRINTF 一致,但效果是执行根据 Format 生成的命令行

              /DO      无论执行结果如何,都将依次执行
              /DOUNTIL 将中止于退出码不为 0 的命令

              效果类似于 forfiles,但使用起来更灵活,如:

               hash /do:"ren ""%s"" ""[%d]%s""",file,n,file
               echo 当前目录下有 %errorlevel% 个 txt 文件
               rem 启用 /return 开关将返回匹配的具体数量

              /PRINTF /DO /DOUNTIL 开关互斥,只能有一个生效
              启用 /RETURN 开关后,将返回最后一条命令的退出码

* /CSV        以逗号为分隔符输出结果
* /NH         指定列标题不在输出中显示
  /UCASE      用大写字母输出 HASH
* /HIDE       隐藏文件名或字符串
* /RELATIVE   输出为相对路径
  /X          使用文件短名
  /SAMPLE[:Step | -MaxCycle]
              开启后,只对文本的一部分内容采样计算 hash,可节省时间
              参数为正数时,每隔 Step 个周期计算 hash
              参数为负数时,只计算到 MaxCycle 个周期为止
              指定的数字越大,采样的内容越少、速度越快
              如未指定扩展参数,视同 /SAMPLE:16
              每个周期可处理 64*1024 Byte,和字符串的长度上限相同

  /RETURN     若未开启此开关,有匹配项时退出码为 0,无匹配项返回 1
              启用此开关后,在退出码中返回被处理的数量,如:

               hash *.txt /return
               echo 当前目录下有 %errorlevel% 个 txt 文件
               rem 启用 /return 开关将返回匹配的具体数量

               hash *.txt && echo 当前目录下存在 txt 文件
               rem 否则只返回成功与否

              无论是否开启此开关,参数错误将返回小于 0 的值,如:

               hash /Undifend *.txt
               if not errorlevel 0 echo /Undifend 是个无效的开关
               rem 语法错误返回小于 0 的值

  /HELP       获取帮助信息
  /ALIAS      列举各个参数别名
  /VERSION[:Number1[.Number2[.Number]]]
              显示当前版本信息,扩展选项可用于判断当前版本号是否高于指定版本号
              版本号分为三个部分,未指定的部分视为 0,如 2.1 等同于 2.1.0
              如高于给定版本号,返回值为 1,若低于则为 -1,若相等则为 0
              若将 : 写成 ::,/VERSION 将只在低于指定版本号时退出

  /DEBUG[:Name|:=Value]
              显示参数解析结果,可用扩展参数筛选输出内容
               /DEBUG:flag 将筛选名称以 flag 开头的项
               /DEBUG:=true 将筛选值为 true 的项

  //          终止参数解析,其后内容将理解为注释
[/quote][版本说明]
版本号没那么严格,只是为了方便自己区分增减了哪些功能,其实 1.4 才是首个公开的版本,之前的版本只在本机或麻烦 broly 那边测试
---------------------------------------------------
0.1 实现批量获取文件的 HASH 及其他一些基本信息
    能够解析多种方式的转义
    支持别名
---------------------------------------------------
1.0 支持字符串
    支持正则筛选
    添加了一些开关

1.1 提供 format 选项,能够格式化输出
    修正 BUG
---------------------------------------------------
1.2 增强 format 选项,能够自定义各项信息出现的顺序
    对时间日期提供 format 设置
    修正 BUG
---------------------------------------------------
1.3 支持用正则表达式从字符串中获取匹配内容,支持替换
    支持用 Attrib 和 Size 筛选文件或字符串
    支持用 D 选项设置工作路径
    补上忘记注明的 FILE 选项,允许从文件中获取列表
    优化代码
    修正 BUG
---------------------------------------------------
1.4 支持用正则表达式的 g 模式,能够进行多次 replace 和 match
    增加 /R 开关
    修改 /D 开关的作用
    为 /S 开关提供深度选项
    修改无参数时的默认行为
    部分函数内联
    修正 BUG
---------------------------------------------------
1.4.1
    当 /F /S /A 并用时,Attrib 显示为文件名
    当 /S /A 并用并从 STDIN 获取输入时,显示为 STDIN
    修正 BUG
---------------------------------------------------
1.4.2
    支持超大文件 size
    对 format 进行类型检查
    增加 /V 开关及扩展选项
    修正 BUG
---------------------------------------------------
1.5
    增加 /DEBUG 开关
    为 /N 开关提供范围选项
    为 /DATE 开关提供范围选项
    replace 的正则表达式必须加 s 或 S 前缀,以区别于 match
    调整执行顺序,优化效率
    化简源码,略微提高可读性
    修正 BUG
---------------------------------------------------
2.0
    增加 /RETURN 开关,可改变退出码的含义
    增加 /SAMPLE 开关,可只对文件的部分内容作计算
    为 /CRC32 /MD5 /SHA1 开关提供筛选选项
    /S 开关的扩展选项含义由指定固定深度改为深度范围
    /SIZE 开关的扩展选项支持指定单位
    /N 开关的扩展选项支持指定计数方式
    启用 /F 开关时,con 表示从标准输入设备获取输入
    启用 /F 开关后,正则匹配条件仅在每个 UnNamed 参数中定义一次
    规范 /# /SHIFT /RE 的作用范围
    数字项改成 double 类型,支持自动转为 long long 类型
    更改遍历文件的实现方式,使其更加通用
    每个开关如果使用了 :: 将会取消先前启用的该开关,但筛选条件仍保留
    修改默认排除的文件类型为文件夹、隐藏、系统
    修改不含 UnNamed 参数时的行为,无参数将统一当作 * 处理
    删除了部分别名
    优化逻辑,提高执行效率
    全面测试,修正一堆 BUG...
---------------------------------------------------
2.1
    增强 /STRING 开关,支持多次替换和匹配
    开放针对多行匹配的 PCRE 原生正则模式
    设置退出时回调函数,避免内存泄露
---------------------------------------------------
2.1.1
    修正一处跳过文件名筛选的笔误
---------------------------------------------------
2.1.2
    修正一处计算目录深度的笔误
---------------------------------------------------
2.1.3
    修正一处默认日期格式多一个空格的笔误
    修正一处未关闭文件句柄的错误
---------------------------------------------------
2.1.4
    修正一处字符串解析的错误
---------------------------------------------------
2.2.0
    增加 /RELATIVE 开关,允许输出为相对路径
    修正一处相对路径的错误
    输出文件夹路径时不再加上 \ 后缀
---------------------------------------------------
2.2.1
    修正一处错误
---------------------------------------------------
3.0
    合并 HASH 与 HASHw,将内码改用 Unicode(UTF-16) 编码
    正则引擎升级至 PCRE2
    增加 /DO 和 /DOUNTIL 开关,允许对每个匹配项执行指定的命令
    增加 /PRINTF 中可用的 Key 种类
    /FILE 改名为 /GROUP,其简写 /F 也改名为 /G,以避免混淆
    可以同时指定的 Key 数量增至 20 个
    修正计算序号早于判断其他属性导致序列不完整的问题
    修正一处正则模式错误的 Bug
---------------------------------------------------
3.0.1
    修正输出路径的一处错误
---------------------------------------------------
3.0.2
    修正日期计算的一处错误
---------------------------------------------------
3.0.3
    修正帮助信息的一处错误
---------------------------------------------------
3.0.4
    修正获取工作路径时可能出现多余字符的问题
---------------------------------------------------
3.0.5
    修正字符串转数字的一处错误
---------------------------------------------------
3.1.0
    修正因内码变更导致 /CRC32 /MD5 /SHA1 开关失效的问题
    增强 /G 开关的功能,可根据文件头支持不同编码的文件
---------------------------------------------------
3.1.1
    修正计算大于2GB文件的MD5出错的问题
---------------------------------------------------
3.1.2
    源码免杀,避免被 360 启发式引擎误报
---------------------------------------------------
3.1.3
    修正以Unicode编码计算参数字符串的HASH的问题
---------------------------------------------------
3.1.4
    修正 /Alias 开关无输出的问题
---------------------------------------------------
3.1.5
    修正因句柄重复关闭导致程序停止运行的问题
---------------------------------------------------
3.1.6
    修正字符串正则匹配出错的问题
    修正 /RELATIVE 开关无法取得相对路径的问题
    修正 /PRINTF 开关的 @name 和 @path 参数的 BUG
    为 /PRINTF 开关的 @path 参数增加 root 子参数

iamby 发表于 2014-6-19 00:02

感谢分享:victory:

CrLf 发表于 2014-8-15 00:26

[i=s] 本帖最后由 CrLf 于 2014-8-16 21:08 编辑 [/i]

2.1 已更新,能想到的常用筛选条件都尽量实现了
窃以为在筛选文件方面的功能比 dir、forfiles 乃至 bash 下的 find 都要全面和强大,目前能够实现基本的文件筛选(路径、文件名、长度、修改日期、属性)、正则筛选、hash筛选(crc32、md5、sha1)、路径深度、计数筛选等各方面的筛选条件,并支持格式化输出
本人 c 语言业余水平,基于运行效率上的考虑和技术原因有些功能未实现,对于这种过两年恐怕连自己都看不懂的源代码,也不奢望会有人来替我继续改造了

CrLf 发表于 2014-8-15 04:25

[i=s] 本帖最后由 CrLf 于 2017-10-11 16:19 编辑 [/i]

正儿八经的用法都在 测试与示例.rar 里了,这里举几个非主流的例子:[code]@hash /t:-30 /debug:timestru_min
rem 获取 30 天前的日期[/code][code]hash /d /nh /size::2~100=KB /do:"echo copy ""%s"" ""%s\\""",file,@path:parent *.txt
rem 拷贝所有大小在 2~100 KB 之间的文件到上级目录
rem 因为只是示例,所以加了一个 echo 代替真实的文件操作[/code][code]help |hash /string:/^^\w+/
rem 从 help 中获取命令名称[/code][code]hash /n::1=b
rem 列举奇数项的文件
hash /n::~0=b
rem 列举偶数项的文件[/code]

imov 发表于 2015-7-18 10:43

多谢分享。感觉蛮实用。

freesoft00 发表于 2015-8-10 09:26

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=149841&ptid=30609]1#[/url] [i]CrLf[/i] [/b]


    可否再增加/SHA256和/SHA512的显示?

CrLf 发表于 2015-12-4 01:40

[i=s] 本帖最后由 CrLf 于 2015-12-4 01:47 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=172674&ptid=30609]6#[/url] [i]freesoft00[/i] [/b]


    hash 算法无穷无尽,但作为区别文件内容的摘要算法,我觉得有几个常用的就够用了,目前没有添加新算法的打算
    即使有更新,重心也将放在增强筛选能力和输出格式的可控性上
    因 pcre 对 gbk 的支持并不太好,所以我本想在正则对中文的兼容性方面下功夫,但 pcre 也不支持 unicode,我原本想全升级成 wchar_t 类型再转 utf-8 来实现兼容的,但后来发现比想象中的麻烦,就没将修改应用到新版中

523066680 发表于 2015-12-18 09:14

[i=s] 本帖最后由 523066680 于 2015-12-18 09:25 编辑 [/i]

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=178929&ptid=30609]7#[/url] [i]CrLf[/i] [/b]

    我觉得用UTF-16吧  跟UNICODE对半拆结果一样。拼装也容易,WideCharToMultiByte  或者 wcstombs 又可以直接用
把main函数弄成wmain,传参进来的时候也是UNICODE的。

只在重定向输出文本的时候考虑gbk

CrLf 发表于 2015-12-18 11:14

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=179706&ptid=30609]8#[/url] [i]523066680[/i] [/b]


    3.0 已更新,合并了 HASHw 的特性,现在也是用 utf-16 了
    并加上了比较实用的 /DO 开关,效果类似于 forfiles,但功能更强大[code]hash /do:"echo ren ""%%s"" ""%%s.%%s""",file,md5,@name:ext
rem 将所有文件重命名成 md5 值+后缀名 的格式,此处以 echo 示例,去掉 echo 则会执行改名操作[/code]

CrLf 发表于 2015-12-19 15:02

3.0 版算是 beta 版,3.1 出来之前,/printf 的扩展参数格式或有变动,已经有思路,回头完善下

dtgc 发表于 2016-2-24 21:16

运行时黑屏一闪而过

CrLf 发表于 2016-2-25 03:35

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=182542&ptid=30609]11#[/url] [i]dtgc[/i] [/b]


    这是命令行程序,用于在 cmd 里调用的

shubao00 发表于 2016-5-24 16:56

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=182546&ptid=30609]12#[/url] [i]CrLf[/i] [/b]
生成结果 能存txt或者其他格式吗?xml最好

CrLf 发表于 2016-6-12 01:51

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=186180&ptid=30609]13#[/url] [i]shubao00[/i] [/b]


    用 printf 参数自行定义输出格式

freesoft00 发表于 2017-2-14 09:41

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=149841&ptid=30609]1#[/url] [i]CrLf[/i] [/b]


    一楼添加上源代码编译方法是不是就更完整了。

CrLf 发表于 2017-2-14 11:05

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=195995&ptid=30609]15#[/url] [i]freesoft00[/i] [/b]


    好的,不过不知道编译的 pcre2 库是否通用

CrLf 发表于 2017-2-14 13:57

[i=s] 本帖最后由 CrLf 于 2017-2-14 14:03 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=195995&ptid=30609]15#[/url] [i]freesoft00[/i] [/b]


pcre2 库的编译参数应该是这个吧:[code]tcc -DHAVE_CONFIG_H -DPCRE2_CODE_UNIT_WIDTH=16 -DPCRE2_STATIC -I. -r -o libpcre16_compile_exec_tcc2.a pcre2_auto_possess.c pcre2_chartables.c pcre2_compile.c pcre2_config.c pcre2_context.c pcre2_dfa_match.c pcre2_jit_compile.c pcre2_maketables.c pcre2_match.c pcre2_match_data.c pcre2_newline.c pcre2_string_utils.c pcre2_study.c pcre2_tables.c pcre2_ucd.c pcre2_valid_utf.c pcre2_xclass.c[/code]附上我用的编译脚本[code]1>1/* :
@echo off
taskkill /f /im hash.exe
taskkill /f /im hashw2.exe
pushd "%~dp0"

cscript -nologo -e:jscript "%~0" <HASHw2.c >HASHw2.encode.c
cd
popd
cd

path %path%;D:\tools\编译\tcc\

tcc.exe HASHw2.encode.c -w^
-Wl,--stack=268435455^
-DPCRE2_CODE_UNIT_WIDTH=16^
F:\Temp\hash\pcre2-10.20\libpcre16_compile_exec_tcc2.a^
-I D:\tools\编译\tcc^
-I .\pcre2-10.20^
-o .\HASHw2.exe||pause

exit /b

*/
WSH.Echo(
        WSH.StdIn.ReadAll()
                .replace(
                        /[^\x00-\x7f][0-9a-z]*/img,
                        function(str){
                                return str.replace(
                                        /./g,
                                        function(c){
                                                return '\\x'+('000'+c.charCodeAt(0).toString(16)).replace(/.*(....)$/,'$1')
                                        }
                                )
                        }
                )
)
[/code]

happy886rr 发表于 2017-2-15 22:27

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=196013&ptid=30609]17#[/url] [i]CrLf[/i] [/b]
非常的不错,就是感觉代码过于庞大,应该分开几个文件写。整一个文件感觉无论是维护起来,还是条理性都欠妥。

CrLf 发表于 2017-2-17 02:36

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=196064&ptid=30609]18#[/url] [i]happy886rr[/i] [/b]


    嗯,维护起来要老命...

dragonqs 发表于 2017-6-19 20:47

谢谢分享!!

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.