无忧启动论坛

标题: PECMD能解析INF或者INI吗? [打印本页]

作者: 求道者    时间: 2023-1-26 20:27
标题: PECMD能解析INF或者INI吗?
本帖最后由 求道者 于 2023-1-26 20:33 编辑

不是脚本,是INI格式的配置文件。
把INI的键值读取到变量里用来判断。


作者: 红毛樱木    时间: 2023-1-26 20:46
Windows有api,可以用pecmd调用
作者: 826773297    时间: 2023-1-27 09:58
ini和inf都能读,不用api,不知道你要读什么
作者: JERRY爱电脑    时间: 2023-1-27 11:46
PECMD有READ功能,可以读取的
作者: 求道者    时间: 2023-1-27 14:02
826773297 发表于 2023-1-27 09:58
ini和inf都能读,不用api,不知道你要读什么

把ini的特定键值读取到变量里。
作者: 826773297    时间: 2023-1-27 15:09
求道者 发表于 2023-1-27 14:02
把ini的特定键值读取到变量里。

一行命令就行,直接读


READ C:\123.INI,**,CurLine

显示出来用MESS

MESS %CurLine%
作者: 826773297    时间: 2023-1-27 15:09
太简单,没什么技术含量
作者: 求道者    时间: 2023-1-27 16:44
826773297 发表于 2023-1-27 15:09
一行命令就行,直接读

**是键名吗?
作者: iaanqrm    时间: 2023-1-27 17:00

作者: 826773297    时间: 2023-1-27 17:14
求道者 发表于 2023-1-27 16:44
**是键名吗?

不是
作者: 826773297    时间: 2023-1-27 17:14
读所有
作者: 826773297    时间: 2023-1-27 17:15
你自己没提供示例,谁知道你要读哪个值
作者: 求道者    时间: 2023-1-27 17:30
826773297 发表于 2023-1-27 17:15
你自己没提供示例,谁知道你要读哪个值
  1. ; last modified 1 April 2001 by John Doe
  2. [owner]
  3. name=John Doe
  4. organization=Acme Products

  5. [database]
  6. server=192.0.2.42 ; use IP address in case network name resolution is not working
  7. port=143
  8. file="acme payroll.dat"
复制代码

标准ini。
只能读取整个文本?
然后自己去搜索,过滤?
作者: 826773297    时间: 2023-1-27 18:38
求道者 发表于 2023-1-27 17:30
标准ini。
只能读取整个文本?
然后自己去搜索,过滤?

比如获取ip部分直接正则就行


READ %desktop%\11111.txt,**,CurLine
SED -ni -ex a=?,server=.*? ,IP,CurLine
MESS %IP%


作者: 求道者    时间: 2023-1-27 18:45
826773297 发表于 2023-1-27 18:38
比如获取ip部分直接正则就行



手动解析总感觉容易出问题。
算了。
作者: dos时代菜鸟    时间: 2023-1-27 19:18
本帖最后由 dos时代菜鸟 于 2023-1-27 19:25 编辑

用 批处理就可以。pecmd 更不在话下。
逐行读取,赋值,字符串切割,判断,找到目标,再赋值显示出来。

脚本区 有现成的脚本。


作者: 826773297    时间: 2023-1-27 20:07
dos时代菜鸟 发表于 2023-1-27 19:18
用 批处理就可以。pecmd 更不在话下。
逐行读取,赋值,字符串切割,判断,找到目标,再赋值显示出来。

...

楼主是问着玩的
作者: szwp    时间: 2023-1-27 21:40
要读file还是port?
作者: 红毛樱木    时间: 2023-1-27 23:54
GetPrivateProfileStringW
https://learn.microsoft.com/zh-c ... ivateprofilestringw

现成的API,读整个文件不科学
作者: adminkk    时间: 2023-1-28 12:23
解析?cmd还能解析么好强大
作者: 求道者    时间: 2023-2-1 23:25
红毛樱木 发表于 2023-1-27 23:54
GetPrivateProfileStringW
https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-get ...

PECMD调用的示例有吗?
作者: 826773297    时间: 2023-2-2 09:08
adminkk 发表于 2023-1-28 12:23
解析?cmd还能解析么好强大

批处理是可以读,都是家常便饭了
作者: 红毛樱木    时间: 2023-2-3 21:45
本帖最后由 红毛樱木 于 2023-2-3 21:56 编辑
求道者 发表于 2023-1-27 17:30
标准ini。
只能读取整个文本?
然后自己去搜索,过滤?

CALL $--ret:&&ret --qd Kernel32.dll,GetPrivateProfileIntW,$database,$port,#0xFFFFFFFF,$%&CurDir%\test.ini
这个你提供的API,好像只能整数。(UNICODE编码的INI)
作者: 求道者    时间: 2023-2-3 22:45
本帖最后由 求道者 于 2023-2-3 23:08 编辑
红毛樱木 发表于 2023-2-3 21:45
CALL $--ret:&&ret --qd Kernel32.dll,GetPrivateProfileIntW,$database,$port,#0xFFFFFFFF,$%&CurDir%\t ...
  1. CALL $--ret:&&ret --qd Kernel32.dll,GetPrivateProfileIntW,程序,外置工具模式,#0xFFFFFFFF,F:\FirPE\FirPE.ini
  2. MESS %&&ret%
复制代码



查询的内容也必须是整数吗?
查询中文返回4294967295

文档里说的Unicode是UTF-8带BOM吧?
FirPE.7z (1.36 KB, 下载次数: 2)
作者: 红毛樱木    时间: 2023-2-3 23:37
求道者 发表于 2023-2-3 22:45
查询的内容也必须是整数吗?
查询中文返回4294967295

0xFFFFFFFF=4294967295
可以自己设置找不到后的返回数据。API说明里有。
UNICODE就是UNICODE,UTF-8就是UTF-8,它俩不同的呀
作者: 求道者    时间: 2023-2-4 01:08
本帖最后由 求道者 于 2023-2-4 01:10 编辑
红毛樱木 发表于 2023-2-3 23:37
0xFFFFFFFF=4294967295
可以自己设置找不到后的返回数据。API说明里有。
UNICODE就是UNICODE,UTF-8就 ...
  1. CALL $--ret:&&ret --qd Kernel32.dll,GetPrivateProfileIntW,程序,外置工具模式,#0xFFFFFFFF,D:\FirPE.ini
  2. MESS %&&ret%
复制代码


https://www.codeproject.com/Arti ... nicode-in-INI-files
In Notepad included with Windows, we can choose 3 encoding formats in Unicode. These are "Unicode" (UTF16-little Endian), "Unicode big Endian" (UTF16-big Endian), and "UTF-8". We can use only UTF16-little endian of these formats as an INI file format. The other encodings do not work correctly (you examine it once). Probably, the reason is that Windows NT, XP or later uses the encoding internally. This is why Windows particularly names UTF16-little Endian "Unicode".


我在Win7下面转码了INI。
获得了所谓UNICODE编码的INI。
但还是读不到。

另外:

可能在Win语境下“UNICODE就是UNICODE,UTF-8就是UTF-8,它俩不同的呀 ”
  1. UTF-8、UTF-16、UTF-32 中的 "UTF" 是 "Unicode Transformation Format"  
  2. 的缩写,意思是"Unicode 转换格式",后面的数 字表明至少使用多少个比特位来存储字符, 比如:UTF-8
  3. 最少需要8个比特位也就是一个字节来存储,对应的,  UTF-16 和 UTF-32 分别需要最少 2 个字节 和 4 个字节来存储
复制代码

UTF-8也是UNICODE,是其子集。
即使是在Win平台,Web世界更认可UTF-8,不存在UTF-8不是UNICODE。
况且Linux/Unix/Mac/移动平台,用UTF-8。
只有Windows因为历史原因钦定UTF16-little Endian为唯一指定UNICODE。
倒不如说Windows才是孤例。
所以我“UNICODE编码是什么鬼东西?UTF-8(我的惯性思维,毕竟我是Linux用户)?还是指UTF-16?”
准确来讲这东西是UTF-16LE 带BOM。

扯完了,回归正题。
即使我转换了正确的编码依旧无法读取。
我特意用AHK生成了标准的INI。
但还是无法读取。
附上INI。

顺带一提,Linux下的默认编码是UTF-8不带BOM。


INI.7z (1.36 KB, 下载次数: 8)

作者: 红毛樱木    时间: 2023-2-4 01:50
本帖最后由 红毛樱木 于 2023-2-4 01:51 编辑
求道者 发表于 2023-2-3 22:45
查询的内容也必须是整数吗?
查询中文返回4294967295
  1. CALL $--ret:&&ret --qd Kernel32.dll,GetPrivateProfileIntW,$程序,$外置工具模式,#0xFFFFFFFF,$%&CurDir%\FirPE.ini
  2. MESS %&&ret%
复制代码


--qd都有前导,#整数,<INT64,*PE变量名,$字符串,=原始串,>VARIANT。
---------------------------------------
PECMD内部使用的是UNICODE就是你说的UTF-16编码,所以用PECMD写代码时,尽量用这个编码。其它编码格式可能需要自己用CODE之类的转换---------------------------------------
我还是觉得用GetPrivateProfileStringW函数比较合适


作者: 红毛樱木    时间: 2023-2-4 11:52
本帖最后由 红毛樱木 于 2023-2-4 12:01 编辑
  1. ENVI^ EnviMode=1
  2. ENVI &MAX_LENGTH=512    //一般长度不会超过512吧,可以自己设置。
  3. SET$# &plpReturnedStrings=*%&MAX_LENGTH% 0
  4. CALL $--qd --bool --ret:&&GetPrivateProfileStringWRet Kernel32.dll,GetPrivateProfileStringW,$database,$server,$GetPrivateProfileStringWRet_Failed_PECMD2012,*&&plpReturnedStrings,#%&MAX_LENGTH%,$%&CurDir%\A.ini
  5. SET-make &lpReturnedStrings=&&plpReturnedStrings;(%&&GetPrivateProfileStringWRet%*2)
  6. MESS. %&&lpReturnedStrings%@%&&GetPrivateProfileStringWRet%
复制代码

作者: 求道者    时间: 2023-2-4 15:23
红毛樱木 发表于 2023-2-4 11:52

我看这个函数要操作指针就没搞了。
作者: nowayer    时间: 2023-12-8 21:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: yyz2191958    时间: 2023-12-9 07:48
进来学习
作者: wang1126    时间: 2024-3-6 10:44
学习学习
作者: jony    时间: 2024-6-10 10:40
红毛樱木 发表于 2023-2-4 11:52

那GetPrivateProfileSectionW这个函数如何用PECMD调用呢




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3