标题: HASH.exe 批量获取文件的 HASH 信息(20170214更新) [打印本页]
作者: CrLf 时间: 2014-6-18 18:20 标题: HASH.exe 批量获取文件的 HASH 信息(20170214更新)
原本只是为了实现文件查重,但后来成了消遣,功能越加越杂...
已升级到 3.0 版本,内码统一为 Unicode(UTF-16),正则引擎改用 PCRE2,并增加了 /DO /DOUNTIL 等强大的开关
http://bcn.bathome.net/s/tool/index.html?key=HASH
链接: https://pan.baidu.com/s/1Mx_QtD4EZzlgticbPn-Meg?pwd=kbmh
源码很怂,专家莫笑
编译参数:- 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
复制代码
重新整合新版测试包,全面测试各块功能:
“hash示例.bat”用于粗略测试主要功能
“各开关测试”文件夹用于详细地单独测试各个开关的执行效果,代码中有注释,也算是示例吧
--------------------------------------------------------------------------------------------------
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[ath] 在输出的结果中包含文件夹,扩展参数可以切换工作路径到 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 的项
// 终止参数解析,其后内容将理解为注释
[版本说明]
版本号没那么严格,只是为了方便自己区分增减了哪些功能,其实 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
感谢分享
作者: CrLf 时间: 2014-8-15 00:26
本帖最后由 CrLf 于 2014-8-16 21:08 编辑
2.1 已更新,能想到的常用筛选条件都尽量实现了
窃以为在筛选文件方面的功能比 dir、forfiles 乃至 bash 下的 find 都要全面和强大,目前能够实现基本的文件筛选(路径、文件名、长度、修改日期、属性)、正则筛选、hash筛选(crc32、md5、sha1)、路径深度、计数筛选等各方面的筛选条件,并支持格式化输出
本人 c 语言业余水平,基于运行效率上的考虑和技术原因有些功能未实现,对于这种过两年恐怕连自己都看不懂的源代码,也不奢望会有人来替我继续改造了
作者: CrLf 时间: 2014-8-15 04:25
本帖最后由 CrLf 于 2017-10-11 16:19 编辑
正儿八经的用法都在 测试与示例.rar 里了,这里举几个非主流的例子:- @hash /t:-30 /debug:timestru_min
- rem 获取 30 天前的日期
复制代码
- hash /d /nh /size::2~100=KB /do:"echo copy ""%s"" ""%s\\""",file,@path:parent *.txt
- rem 拷贝所有大小在 2~100 KB 之间的文件到上级目录
- rem 因为只是示例,所以加了一个 echo 代替真实的文件操作
复制代码
- help |hash /string:/^^\w+/
- rem 从 help 中获取命令名称
复制代码
- hash /n::1=b
- rem 列举奇数项的文件
- hash /n::~0=b
- rem 列举偶数项的文件
复制代码
作者: imov 时间: 2015-7-18 10:43
多谢分享。感觉蛮实用。
作者: freesoft00 时间: 2015-8-10 09:26
回复 1# CrLf
可否再增加/SHA256和/SHA512的显示?
作者: CrLf 时间: 2015-12-4 01:40
本帖最后由 CrLf 于 2015-12-4 01:47 编辑
回复 6# freesoft00
hash 算法无穷无尽,但作为区别文件内容的摘要算法,我觉得有几个常用的就够用了,目前没有添加新算法的打算
即使有更新,重心也将放在增强筛选能力和输出格式的可控性上
因 pcre 对 gbk 的支持并不太好,所以我本想在正则对中文的兼容性方面下功夫,但 pcre 也不支持 unicode,我原本想全升级成 wchar_t 类型再转 utf-8 来实现兼容的,但后来发现比想象中的麻烦,就没将修改应用到新版中
作者: 523066680 时间: 2015-12-18 09:14
本帖最后由 523066680 于 2015-12-18 09:25 编辑
回复 7# CrLf
我觉得用UTF-16吧 跟UNICODE对半拆结果一样。拼装也容易,WideCharToMultiByte 或者 wcstombs 又可以直接用
把main函数弄成wmain,传参进来的时候也是UNICODE的。
只在重定向输出文本的时候考虑gbk
作者: CrLf 时间: 2015-12-18 11:14
回复 8# 523066680
3.0 已更新,合并了 HASHw 的特性,现在也是用 utf-16 了
并加上了比较实用的 /DO 开关,效果类似于 forfiles,但功能更强大- hash /do:"echo ren ""%%s"" ""%%s.%%s""",file,md5,@name:ext
- rem 将所有文件重命名成 md5 值+后缀名 的格式,此处以 echo 示例,去掉 echo 则会执行改名操作
复制代码
作者: CrLf 时间: 2015-12-19 15:02
3.0 版算是 beta 版,3.1 出来之前,/printf 的扩展参数格式或有变动,已经有思路,回头完善下
作者: dtgc 时间: 2016-2-24 21:16
运行时黑屏一闪而过
作者: CrLf 时间: 2016-2-25 03:35
回复 11# dtgc
这是命令行程序,用于在 cmd 里调用的
作者: shubao00 时间: 2016-5-24 16:56
回复 12# CrLf
生成结果 能存txt或者其他格式吗?xml最好
作者: CrLf 时间: 2016-6-12 01:51
回复 13# shubao00
用 printf 参数自行定义输出格式
作者: freesoft00 时间: 2017-2-14 09:41
回复 1# CrLf
一楼添加上源代码编译方法是不是就更完整了。
作者: CrLf 时间: 2017-2-14 11:05
回复 15# freesoft00
好的,不过不知道编译的 pcre2 库是否通用
作者: CrLf 时间: 2017-2-14 13:57
本帖最后由 CrLf 于 2017-2-14 14:03 编辑
回复 15# freesoft00
pcre2 库的编译参数应该是这个吧:- 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
复制代码
附上我用的编译脚本- 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')
- }
- )
- }
- )
- )
复制代码
作者: happy886rr 时间: 2017-2-15 22:27
回复 17# CrLf
非常的不错,就是感觉代码过于庞大,应该分开几个文件写。整一个文件感觉无论是维护起来,还是条理性都欠妥。
作者: CrLf 时间: 2017-2-17 02:36
回复 18# happy886rr
嗯,维护起来要老命...
作者: dragonqs 时间: 2017-6-19 20:47
谢谢分享!!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |