无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 5402|回复: 17
打印 上一主题 下一主题

请教批处理高手, 怎样用批处理读取ini文件某些键的值?

[复制链接]
跳转到指定楼层
1#
发表于 2021-3-8 13:06:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
想自己搞个批处理,读取ini某些键的值,然后用这些值修改IP地址,未完工的代码如下:
  1. @ECHO OFF
  2. IF EXIST 1.ini (
  3. ::下面是读取ini对应的值代码

  4. ::IP地址
  5. set staticip=
  6. ::子网掩码
  7. set subnetmask=
  8. ::网关
  9. set gateways=

  10. wmic nicconfig where ipenabled=true call enablestatic(%staticip%),(%subnetmask%)
  11. wmic nicconfig where ipenabled=true call setgateways(%gateways%)
  12. )

  13. exit
复制代码
1.ini文件的内容如下:
  1. [okm]
  2. abc=678
  3. zxc=456
  4. qwe=789
  5. cxz=147

  6. [cbd]
  7. abc=123
  8. qwe=321
  9. qaz=534

  10. wsx=765
  11. edc=258

  12. [NET]
  13. IP地址=192.168.1.168
  14. 子网掩码=255.255.255.0
  15. 网关=192.168.1.1
复制代码
通过百度找了一些读取ini键的代码, 但是只能读英文键的值, 例如下面的代码, okm abc 读取成功,NET IP地址读不到值:
  1. ::https://zhidao.baidu.com/question/604778692
  2. @echo off&setlocal ENABLEDELAYEDEXPANSION
  3. call :解析 1.ini
  4. call :提取 okm abc
  5. call :提取 NET IP地址
  6. goto :eof


  7. :解析 [参数#1=ini文件路径]
  8. set "op="
  9. for /f " usebackq tokens=1* delims==" %%a in ("%~1") do (
  10.     if "%%b"=="" (
  11.         set "op=%%a"
  12.     ) else (
  13.         set "##!op!#%%a=%%b"
  14.     )
  15. )
  16. goto :eof


  17. :提取 [参数#1=Option] [参数#2=Key]
  18. echo,Option=%~1,Key=%~2,Value=!##[%~1]#%~2!
  19. pause
  20. goto :eof
复制代码
另外, 怎样把读取ini值的代码,加到最上面的代码中来修改IP地址呢? 期待高手能指点一二, 非常感谢!
2#
发表于 2021-3-8 13:12:46 | 只看该作者

点评

感谢提醒, 怎么移动过去?  详情 回复 发表于 2021-3-8 13:18
回复

使用道具 举报

3#
发表于 2021-3-8 13:16:53 来自手机 | 只看该作者
通过tokens分割= 利用findstr正则匹配ip段。
就这样。
楼主这么多求助帖,学而不进啊。

点评

感谢鞭策, 真是惭愧, 对批处理一直一知半解  详情 回复 发表于 2021-3-8 13:19
回复

使用道具 举报

4#
 楼主| 发表于 2021-3-8 13:18:08 | 只看该作者
阿非 发表于 2021-3-8 13:12
建议发到脚本讨论区
http://bbs.wuyou.net/forum.php?mod=forumdisplay&fid=36

感谢提醒, 怎么移动过去?
回复

使用道具 举报

5#
 楼主| 发表于 2021-3-8 13:19:19 | 只看该作者
荣耀 发表于 2021-3-8 13:16
通过tokens分割= 利用findstr正则匹配ip段。
就这样。
楼主这么多求助帖,学而不进啊。

感谢鞭策, 真是惭愧, 对批处理一直一知半解
回复

使用道具 举报

6#
发表于 2021-3-8 16:48:15 | 只看该作者
本帖最后由 Climbing 于 2021-3-8 16:59 编辑

多年前的实践经验告诉我,批处理读取写入ini文件应该有专门的软件,这种用for循环的,无法处理ini文件中的段,比如上面的okm、cbd就属于段的内容,如果不同段有重复的变量就比较麻烦。

在纯DOS时代,有一个inifile.com工具,相关信息:
--------------------------------------------------------------------
    INIFILE Write and Read             Ver 1.2 (c) 2003, Horst Schaeffer
    --------------------------------------------------------------------

    This DOS program handles Windows type INI files with section names
    in square brackets, and assignments of the form: item=string
    (case ignored for section and item names), for example:

        [Desktop]
        Wallpaper=C:\WINDOWS\GBLUE.BMP
        TileWallpaper=1

    Not supported in this version:

    -   multiple items with same name in same section (only the first
        occurrence will be found)
    -   handling of multiple (comma separated) assignments for an item
        (only the complete string is read or written)


    Change or add an assignment
    ---------------------------

    Syntax:  INIFILE inifile_name [section] item=string

    Example: INIFILE %windir%\win.ini [Desktop] TileWallpaper=1

在Windows时代,我印象中nircmd是可以操作ini文件的。
补充:
1、https://stackoverflow.com/questions/2866117/windows-batch-script-to-read-an-ini-file
这里有很多大神写的纯批处理解决方案。

2、https://toolscenter.lenovofiles.com/help/index.jsp?topic=%2Fsgtk_sa_win%2Fclini_exe.html

这里有联想(IBM)的一个专用于处理ini文件的命令行工具:CLINI.exe,但没找到下载。
回复

使用道具 举报

7#
发表于 2021-3-8 18:49:54 | 只看该作者
本帖最后由 nttwqz 于 2021-3-8 18:51 编辑

下载NSIS自己编译

  1. Unicode true
  2. ManifestDPIAware true
  3. SetCompressor lzma

  4. Name "根据INI设置IP"
  5. Caption "根据INI设置IP"
  6. OutFile "根据INI设置IP.exe"

  7. Section
  8. SectionEnd

  9. Function .onInit
  10.     StrCpy $R0 "$EXEDIR\IP.ini"
  11.     IfFileExists $R0 0 Error
  12.     ReadINIStr $0 $R0 "NET" "IP地址"
  13.     ReadINIStr $1 $R0 "NET" "子网掩码"
  14.     ReadINIStr $2 $R0 "NET" "默认网关"
  15.     ReadINIStr $3 $R0 "NET" "首选DNS"
  16.     ReadINIStr $4 $R0 "NET" "备用DNS"
  17.     MessageBox MB_OK "\
  18.         IP  地址:$0$\r$\n\
  19.         子网掩码:$1$\r$\n\
  20.         默认网关:$2$\r$\n\
  21.         首选DNS:$3$\r$\n\
  22.         备用DNS:$4$\r$\n"
  23.     ;将下面“”内的命令替换成设置IP的命令
  24.     Exec "cmd /c echo IP  地址:$0 & echo 子网掩码:$1 & echo 默认网关:$2 & echo 首选DNS:$3 & echo 备用DNS:$4 & pause"
  25.     Quit
  26.     Error:
  27.         MessageBox MB_OK|MB_ICONSTOP "错误:未在当前目录下找到IP.ini。"
  28.     Quit
  29. FunctionEnd
复制代码


点评

感谢大侠帮忙, 还看不懂, 先收藏  详情 回复 发表于 2021-3-8 22:00
回复

使用道具 举报

8#
 楼主| 发表于 2021-3-8 22:00:23 | 只看该作者
nttwqz 发表于 2021-3-8 18:49
下载NSIS自己编译

感谢大侠帮忙, 还看不懂, 先收藏

点评

给你玩玩: [attachimg]476356[/attachimg]  详情 回复 发表于 2021-3-9 12:13
给你玩玩: [attachimg]476353[/attachimg]  详情 回复 发表于 2021-3-9 12:06
回复

使用道具 举报

9#
发表于 2021-3-9 00:52:48 | 只看该作者
用其他脚本实现不更方便吗? 像autoit,简单明了
IniRead
读配置文件(*.ini)的值.


IniRead("文件名", "字段名", "关键字", "默认值")


参 数
文件名 目标 .ini 文件名.
字段名 .ini 文件中的字段名.
关键字 .ini 文件中的关键字名称.
默认值 若未发现指定的关键字, 则函数将返回此默认值.

返 回 值
成功: 返回请求关键字的值.
失败: 若指定的关键字的值未发现, 则函数将返回参数"默认值"设置的值.
回复

使用道具 举报

10#
发表于 2021-3-9 08:07:25 | 只看该作者
findstr "[0-9]\." 1.ini pause
回复

使用道具 举报

11#
发表于 2021-3-9 08:07:48 | 只看该作者
findstr "[0-9]\." 1.ini
pause
回复

使用道具 举报

12#
发表于 2021-3-9 14:10:16 | 只看该作者

这个是自己做的?用的哪种工具?对实现方法很感兴趣。

点评

这其实是一段PECMD代码: (至于怎么做成一个控制台程序,这里有说明:https://pecmd.net/thread-122.htm) #code=936T950 ENVI^ EnviMode=1 ENVI^ ForceLocal=1 SET$ &NL=0d 0a READ %1,**,&a ENVI> &a=%&  详情 回复 发表于 2021-3-9 17:40
回复

使用道具 举报

13#
 楼主| 发表于 2021-3-9 14:30:00 | 只看该作者

感谢大侠帮助, 能公开批处理吗?

点评

能啊,批处理如下 : @echo off for /f "tokens=*" %%i in ('%~sdp0inifile.exe %~sdp0test.ini NET IP地址') do ( set "aa=%%i" ) echo %aa% pause  详情 回复 发表于 2021-3-9 18:00
回复

使用道具 举报

14#
发表于 2021-3-9 18:19:38 来自手机 | 只看该作者
其实用纯 CMD 就可以,无非就是for +if +set
回复

使用道具 举报

15#
发表于 2021-3-9 19:05:17 来自手机 | 只看该作者
527104427 发表于 2021-3-9 17:40
这其实是一段PECMD代码:  (至于怎么做成一个控制台程序,这里有说明:https://pecmd.net/thread-122.ht ...

我去,这么复杂,虽然nsis的语法也别扭,但是和这比起来那可真是小巫见大巫了。

点评

也有简单的,我就是想验证一下这种思路可不可行  详情 回复 发表于 2021-3-9 19:17
回复

使用道具 举报

16#
发表于 2021-3-9 23:03:08 | 只看该作者
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. rem 附带三个参数 %1=ini文件,%2=段名 %3=项目名
  4. rem 返回某 ini 文件 特定段中特定项目的值

  5. if [%3]==[] goto :error1

  6. for /f "delims=" %%c in ('type %1') do (
  7.         set "L1=%%c"
  8.         set "L1=!L1: =!"
  9.         if  "!L1:~0,1!"=="["  (
  10.                 set begin=0
  11.                 if /i !L1!==[%~2] (set begin=1)
  12.         )
  13.         if !begin! equ 1 (
  14.                 for /f "tokens=1,2 delims==" %%i in ("!L1!") do (
  15.                         set "item1=%%i"
  16.                         set "item1=!item1: =!"
  17.                         if /i [!item1!]==[%~3] (set "Value=%%j")
  18.                 )
  19.         )
  20. )
  21. if not defined value (
  22.         echo 查无此项.
  23. ) else (
  24.         echo %~3 = !value!
  25. )
  26. pause
  27. goto :eof

  28. :error1
  29. echo 参数错误
复制代码










回复

使用道具 举报

17#
发表于 2021-3-10 09:57:17 | 只看该作者
在我6楼的第一个链接里就有楼上这种纯批处理解决方案,读取ini内容的代码都封装成了批处理函数调用的形式,拿来直接用就行。
回复

使用道具 举报

18#
发表于 2021-3-12 15:17:25 | 只看该作者
感觉找到组织了啊,请大家多多赐教,一起学习
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-23 19:34

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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