无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 3616|回复: 31
打印 上一主题 下一主题

[求助] PECMD能解析INF或者INI吗?

[复制链接]
跳转到指定楼层
1#
发表于 2023-1-26 20:27:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 求道者 于 2023-1-26 20:33 编辑

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

2#
发表于 2023-1-26 20:46:27 来自手机 | 只看该作者
Windows有api,可以用pecmd调用
回复

使用道具 举报

3#
发表于 2023-1-27 09:58:13 | 只看该作者
ini和inf都能读,不用api,不知道你要读什么

点评

把ini的特定键值读取到变量里。  详情 回复 发表于 2023-1-27 14:02
回复

使用道具 举报

4#
发表于 2023-1-27 11:46:40 | 只看该作者
PECMD有READ功能,可以读取的
回复

使用道具 举报

5#
 楼主| 发表于 2023-1-27 14:02:21 来自手机 | 只看该作者
826773297 发表于 2023-1-27 09:58
ini和inf都能读,不用api,不知道你要读什么

把ini的特定键值读取到变量里。

点评

一行命令就行,直接读 READ C:\123.INI,**,CurLine 显示出来用MESS MESS %CurLine%  详情 回复 发表于 2023-1-27 15:09
回复

使用道具 举报

6#
发表于 2023-1-27 15:09:04 | 只看该作者
求道者 发表于 2023-1-27 14:02
把ini的特定键值读取到变量里。

一行命令就行,直接读


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

显示出来用MESS

MESS %CurLine%

点评

**是键名吗?  详情 回复 发表于 2023-1-27 16:44
回复

使用道具 举报

7#
发表于 2023-1-27 15:09:31 | 只看该作者
太简单,没什么技术含量
回复

使用道具 举报

8#
 楼主| 发表于 2023-1-27 16:44:17 | 只看该作者
826773297 发表于 2023-1-27 15:09
一行命令就行,直接读

**是键名吗?

点评

不是  详情 回复 发表于 2023-1-27 17:14
回复

使用道具 举报

9#
发表于 2023-1-27 17:00:15 | 只看该作者
回复

使用道具 举报

10#
发表于 2023-1-27 17:14:28 | 只看该作者

不是
回复

使用道具 举报

11#
发表于 2023-1-27 17:14:41 | 只看该作者
读所有
回复

使用道具 举报

12#
发表于 2023-1-27 17:15:29 | 只看该作者
你自己没提供示例,谁知道你要读哪个值

点评

标准ini。 只能读取整个文本? 然后自己去搜索,过滤?  详情 回复 发表于 2023-1-27 17:30
回复

使用道具 举报

13#
 楼主| 发表于 2023-1-27 17:30:09 | 只看该作者
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。
只能读取整个文本?
然后自己去搜索,过滤?

点评

CALL $--ret:&&ret --qd Kernel32.dll,GetPrivateProfileIntW,$database,$port,#0xFFFFFFFF,$%&CurDir%\test.ini 这个你提供的API,好像只能整数。  详情 回复 发表于 2023-2-3 21:45
比如获取ip部分直接正则就行 [attachimg]518651[/attachimg] READ %desktop%\11111.txt,**,CurLine SED -ni -ex a=?,server=.*? ,IP,CurLine MESS %IP%  详情 回复 发表于 2023-1-27 18:38
回复

使用道具 举报

14#
发表于 2023-1-27 18:38:49 | 只看该作者
求道者 发表于 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
回复

使用道具 举报

15#
 楼主| 发表于 2023-1-27 18:45:38 来自手机 | 只看该作者
826773297 发表于 2023-1-27 18:38
比如获取ip部分直接正则就行



手动解析总感觉容易出问题。
算了。
回复

使用道具 举报

16#
发表于 2023-1-27 19:18:46 | 只看该作者
本帖最后由 dos时代菜鸟 于 2023-1-27 19:25 编辑

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

脚本区 有现成的脚本。

点评

楼主是问着玩的  详情 回复 发表于 2023-1-27 20:07
回复

使用道具 举报

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

...

楼主是问着玩的
回复

使用道具 举报

18#
发表于 2023-1-27 21:40:08 来自手机 | 只看该作者
要读file还是port?
回复

使用道具 举报

19#
发表于 2023-1-27 23:54:52 | 只看该作者
GetPrivateProfileStringW
https://learn.microsoft.com/zh-c ... ivateprofilestringw

现成的API,读整个文件不科学

点评

PECMD调用的示例有吗?  详情 回复 发表于 2023-2-1 23:25
回复

使用道具 举报

20#
发表于 2023-1-28 12:23:02 | 只看该作者
解析?cmd还能解析么好强大

点评

批处理是可以读,都是家常便饭了  详情 回复 发表于 2023-2-2 09:08
回复

使用道具 举报

21#
 楼主| 发表于 2023-2-1 23:25:13 | 只看该作者
红毛樱木 发表于 2023-1-27 23:54
GetPrivateProfileStringW
https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-get ...

PECMD调用的示例有吗?
回复

使用道具 举报

22#
发表于 2023-2-2 09:08:46 | 只看该作者
adminkk 发表于 2023-1-28 12:23
解析?cmd还能解析么好强大

批处理是可以读,都是家常便饭了
回复

使用道具 举报

23#
发表于 2023-2-3 21:45:37 | 只看该作者
本帖最后由 红毛樱木 于 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
回复

使用道具 举报

24#
 楼主| 发表于 2023-2-3 22:45:19 | 只看该作者
本帖最后由 求道者 于 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)

点评

--qd都有前导,#整数,VARIANT。 --------------------------------------- PECMD内部使用的是UNICODE就是你说的UTF-16编码,所以用PECMD写代码时,尽量用这个编码。其它编码格式可能需要自己用CODE之类的转换  详情 回复 发表于 2023-2-4 01:50
0xFFFFFFFF=4294967295 可以自己设置找不到后的返回数据。API说明里有。 UNICODE就是UNICODE,UTF-8就是UTF-8,它俩不同的呀  详情 回复 发表于 2023-2-3 23:37
回复

使用道具 举报

25#
发表于 2023-2-3 23:37:01 | 只看该作者
求道者 发表于 2023-2-3 22:45
查询的内容也必须是整数吗?
查询中文返回4294967295

0xFFFFFFFF=4294967295
可以自己设置找不到后的返回数据。API说明里有。
UNICODE就是UNICODE,UTF-8就是UTF-8,它俩不同的呀

点评

UTF-8也是UNICODE,是其子集。 即使是在Win平台,Web世界更认可UTF-8,不存在UTF-8不是UNICODE。 况且Linux/Unix/Mac/移动平台,用UTF-8。 只有Windows因为历史原因钦定UTF16-little Endian为唯一指定UNICODE。 倒  详情 回复 发表于 2023-2-4 01:08
回复

使用道具 举报

26#
 楼主| 发表于 2023-2-4 01:08:29 | 只看该作者
本帖最后由 求道者 于 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)
回复

使用道具 举报

27#
发表于 2023-2-4 01:50:01 | 只看该作者
本帖最后由 红毛樱木 于 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函数比较合适

回复

使用道具 举报

28#
发表于 2023-2-4 11:52:47 | 只看该作者
本帖最后由 红毛樱木 于 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
回复

使用道具 举报

29#
 楼主| 发表于 2023-2-4 15:23:07 | 只看该作者

我看这个函数要操作指针就没搞了。
回复

使用道具 举报

30#
发表于 2023-12-8 21:01:37 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-3 00:49

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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