[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 用.cmd 批处理脚本修改 wincmd.ini 配置文件

【运行环境】最简单的WinXP,只有cmd 批处理脚本可用,vbs 不行,
如果谁能告诉我,给系统再加些什么文件可使其支持vbs 脚本,也感谢,但为了学习我想用.cmd。

【问题】用批处理脚本.cmd 修改一个名为 wincmd.ini 的配置文件,把它4个节中的4条参数
记录的路径都改成 Windows 环境变量 %TEMP% 指定的那个系统临时文件夹。
wincmd.ini 位于 %TEMP% 指定的这个系统临时文件夹内的子文件夹里(x:\xxx\tcmd\,见下面假设)。
为方便举例,下面假设 %TEMP% 指定的系统临时文件夹是 x:\xxx\

%TEMP%\tcmd\ wincmd.ini 内容:
    ……(无关内容略去不提,下同)
    [left]
    ……
    path=a:\aaa\  (不管原先什么路径,都修改成 path=x:\xxx\
    ……
    [right]
    ……
    path=b:\bbb\  (不管原先什么路径,都修改成 path=x:\xxx\tcmd\
    ……
    [LeftHistory]
    ……
    0=c:\ccc\  (不管原先什么路径,都修改成 0=x:\xxx\
    1=……
    ……
    [RightHistory]
    ……
    0=d:\ddd\  (不管原先什么路径,都修改成 0=x:\xxx\tcmd\
    1=……
    ……
【注意】
1. 上述4节在 wincmd.ini 文件中出现的位置、顺序,以及参数 path、0 在节内的位置都不是固定的,
要先找到那个节,再在节中找那个参数修改,不能改了别的节中类似参数。
因权限低,可能的话,过后我再把实际的 wincmd.ini 传到附件里供试验。
2. wincmd.ini 不懂“%TEMP%”是啥意思,得把 %TEMP% 指代的那个具体文件夹名(此处假设为 x:\xxx\)改写进去。

我先弄一个简单的,抛个砖:

    set a=false  (a=true 即表明已找到[left]节)
    set b=false  (b=true 则表明已找到[right]节)
    set c=false  (c=true 则表明已找到[LeftHistory]节)
    set d=false  (d=true 则表明已找到[RightHistory]节)

    set e=false  (e=true 即表明已完成[left]节中的 path= 字串替换)
    set f=false  (f=true 则表明已完成[right]节中的 path= 字串替换)
    set g=false  (g=true 则表明已完成[LeftHistory]节的 0= 字串替换)
    set h=false  (h=true 则表明已完成[RightHistory]节的 0= 字串替换)

    for /f "tokens=*,delims=" %%i in (%TEMP%\tcmd\wincmd.ini) do (
        set str=%%i
        setlocal enabledelayedexpansion
    ::以下先找节
        if a=false (if str=="[left]" set a=true)
        if b=false (if str=="[right]" set b=true)
        if c=false (if str=="[LeftHistory]" set c=true)
        if d=false (if str=="[RightHistory]" set d=true)
    ::若已找到节则再找相应的键
        if a=true (if e=false (if !str:~0,5!=="path=" (set str="path="%TEMP%\ & set e=true)))
        if b=true (if f=false (if !str:~0,5!=="path=" (set str="path="%TEMP%\tcmd\ & set f=true)))
        if c=true (if g=false (if !str:~0,2!=="0=" (set str="0="%TEMP%\ & set g=true)))
        if d=true (if h=false (if !str:~0,2!=="0=" (set str="0="%TEMP%\tcmd\ & set h=true)))
        endlocal

        echo !str! >> wincmd.tmp
    )

    del %TEMP%\wincmd.ini
    ren %TEMP%\wincmd.tmp %TEMP%\wincmd.ini

请高手帮忙看看有什么语法错误或考虑不周之处,
有些特殊情况,这段程序没考虑进去,
比如没有要找的节,或者那个节中没有那个键,那就得添加进去那个键及键值,
另外据说 for /f 语句对空行,和首字符为分号";"的行,会跳过去,
这样就会丢失某些行,而无论是空行还是带";"号的注释行,我都要保留,
所以这个程序还需要继续改进,请高手们抽空指点一二,先谢了。

顺祝全体版主和回帖人士节日愉快清爽暑凉。

PS:这里发帖的页面编辑功能真棒,是我见过的最好的!!!

就是登录之后没分反而不能像游客那样到处看帖打印,有点越守法成本越高那意思。

  1. REM a=true 即表明已找到[left]节
  2. set a=false
  3. REM b=true 则表明已找到[right]节
  4. set b=false
  5. REM c=true 则表明已找到[LeftHistory]节
  6. set c=false
  7. REM d=true 则表明已找到[RightHistory]节
  8. set d=false
  9. REM e=true 即表明已完成[left]节中的 path= 字串替换
  10. set e=false
  11. REM f=true 则表明已完成[right]节中的 path= 字串替换
  12. set f=false
  13. REM g=true 则表明已完成[LeftHistory]节的 0= 字串替换
  14. set g=false
  15. REM h=true 则表明已完成[RightHistory]节的 0= 字串替换
  16. set h=false
  17. for /f "delims=" %%i in (%TEMP%\tcmd\wincmd.ini) do (
  18.     set str=%%i
  19.     setlocal enabledelayedexpansion
  20.     REM [left]
  21.     if "!a!" equ "false" (
  22.         if "!str!" equ "[left]" set a=true
  23.     ) else (
  24.         if "!e!" equ "false" (
  25.             if "!str:~0,5!" equ "path=" (
  26.                 set "str=path=%TEMP%\"
  27.                 set e=true
  28.             )
  29.         )
  30.     )
  31.     REM [right]
  32.     if "!b!" equ "false" (
  33.         if "!str!" equ "[right]" set b=true
  34.     ) else (
  35.         if "!f!" equ "false" (
  36.         if "!str:~0,5!" equ "path=" (
  37.                 set "str=path=%TEMP%\tcmd\"
  38.                 set f=true
  39.             )
  40.         )
  41.     )
  42.     REM [LeftHistory]
  43.     if "!c!" equ "false" (
  44.         if "!str!" equ "[LeftHistory]" set c=true
  45.     ) else (
  46.         if "!g!" equ "false" (
  47.             if "!str:~0,2!" equ "0=" (
  48.                 set "str=0=%TEMP%\"
  49.                 set g=true
  50.             )
  51.         )
  52.     )
  53.     REM [RightHistory]
  54.     if "!d!" equ "false" (
  55.         if "!str!" equ "[RightHistory]" set d=true
  56.     ) else (
  57.         if "!h!" equ "false" (
  58.             if "!str:~0,2!" equ "0=" (
  59.                 set "str=0=%TEMP%\tcmd\"
  60.                 set h=true
  61.             )
  62.         )
  63.     )
  64.     endlocal
  65.     >>%TEMP%\wincmd.tmp echo,!str!
  66. )
  67. move /y %TEMP%\wincmd.tmp %TEMP%\wincmd.ini
复制代码
Talk is cheap. Show me the code.
没事不要瞎扯淡,有能耐就把代码贴出来给我看。

TOP

windows资源包有个iniman.exe,可以实现这些

TOP

本帖最后由 uhnmki 于 2013-8-12 17:44 编辑

感谢 gawk:
    版排的很好看,是用专门的批处理编辑排版工具做的吗,哪里有,也给我一份。
    有几个问题:
批处理 if 里能不能用"=="比较两个字符串?用 equ 相比有什么不同之处?
set "str=path=%TEMP%\" set 赋值用引号吗?引号里面2个"=" 能被 cmd 正确执行吗?
move 是外部命令还是内部命令,早先DOS6.22下move是个外部命令,若是cmd下还需要
外部命令move的话,那还不如笨点,先del,再ren,这样不必再往PE系统里拷进move程序。
>>%TEMP%\wincmd.tmp echo,!str! 写的顺序和 echo,!str! >>%TEMP%\wincmd.tmp
相反,cmd 里可以这样用?这样写的好处是?

在你给的基础上我又改了一下,不过这回我先不定义各变量,等找到节/参数条目了才定义,
借变量是否有定义可以判断:是否正在某节中读取及是否已完成对该节中的参数条目的修改。
不知道这么做是否可行

此外我还要增加修改 wincmd.ini 的另一个参数,即在[Packer]节里设置外部压缩软件的路径:
[Packer]
RAR=光盘盘符\PROGRAMS\SYSTEM\WINRAR\WINRAR.EXE(或者用 rar.exe)


已确定要将此脚本放在光盘上,所在光盘盘符可由如下脚本得知:
SET Var0=%0
FOR /f "delims=" %%I in ("%Var0%") do Set OP=%%~dI


以上2句是抄来的,虽不明白%%~dI怎么回事,但知道变量%OP%保存的就是光盘盘符。
就是说,本脚本运行后还要将[Packer]中"RAR="原来的路径替换为:
RAR=%OP%\PROGRAMS\SYSTEM\WINRAR\WINRAR.EXE(rar.exe亦可)

以下是新程序:
  1. REM %OP%为侦测得知的光盘盘符(本脚本存放在光盘上)。
  2. SET Var0=%0
  3. FOR /f "delims=" %%o in ("%Var0%") do Set OP=%%~dI
  4. REM a=true 即表明已找到[left]节
  5. REM b=true 则表明已找到[right]节
  6. REM c=true 则表明已找到[LeftHistory]节
  7. REM d=true 则表明已找到[RightHistory]节
  8. REM e=true 即表明已完成[left]节中的 path= 字串替换
  9. REM f=true 则表明已完成[right]节中的 path= 字串替换
  10. REM g=true 则表明已完成[LeftHistory]节的 0= 字串替换
  11. REM h=true 则表明已完成[RightHistory]节的 0= 字串替换
  12. REM i=true 则表明已找到[Packer]节
  13. REM j=true 后表明已完成[Packer]节的 RAR= 字串替换
  14. for /f "eol=,usebackq,tokens=*,delims=" %%k in (%TEMP%\tcmd\wincmd.ini) do (
  15.     set str=%%k
  16.     setlocal enabledelayedexpansion
  17.     REM [left]
  18.     if not defined a (if !str!=="[left]" set a=true
  19.     ) else (if not defined e (if !str:~0,5!=="path=" (
  20.                                  set "str=path=%TEMP%\"
  21.                                  set e=true
  22.                               )
  23.             )
  24.     )
  25.     REM [right]
  26.     if not defined b (if !str!=="[right]" set b=true
  27.     ) else (if not defined f (if !str:~0,5!=="path=" (
  28.                                  set "str=path=%TEMP%\tcmd\"
  29.                                  set f=true
  30.                               )
  31.             )
  32.     )
  33.     REM [LeftHistory]
  34.     if not defined c (if !str!=="[LeftHistory]" set c=true
  35.     ) else (if not defined g (if !str:~0,2!=="0=" (
  36.                                  set "str=0=%TEMP%\"
  37.                                  set g=true
  38.                               )
  39.             )
  40.     )
  41.     REM [RightHistory]
  42.     if not defined d (if !str!=="[RightHistory]" set d=true
  43.     ) else (if not defined h (if !str:~0,2!=="0=" (
  44.                                  set "str=0=%TEMP%\tcmd\"
  45.                                  set h=true
  46.                               )
  47.             )
  48.     )
  49.     REM [Packer]
  50.     if not defined i (if !str!=="[Packer]" set i=true
  51.     ) else (if not defined j (if !str:~0,4!=="RAR=" (
  52.                                  set "str=RAR=!OP!\PROGRAMS\SYSTEM\WINRAR\WINRAR.EXE"
  53.                                  set j=true
  54.                               )
  55.             )
  56.     )
  57.     endlocal
  58.     echo,!str! >>%TEMP%\wincmd.tmp
  59. )
  60. move /y %TEMP%\wincmd.tmp %TEMP%\wincmd.ini
复制代码
【解释】
1) for /f "eol=,……" %%k in (……)……
想用"eol=空值"开关,避免 cmd 弃读以分号";"开头的行
2) for /f "usebackq,……" %%k in (……)……
想用"usebackq"开关,允许变量 %TEMP% 里含单引号和空格等多义字符,不知这招能行否


感谢 zz100001
    查了下,iniman.exe 好像是 Win2003 包里的,能以脚本方式用在WinPE里吗?

本来要把 wincmd.ini 传上来,但是这里非要先装什么破Adobe插件才行,诡异,想到斯诺登,还是quNMD吧。

这里编辑功能不错,但是怎么就没有预览功能呢?

TOP

C:\Windows\System32\cscript.exe
C:\Windows\System32\wscript.exe
估计 就是 此类文件吧,

感觉楼主是在 搞WINPE移植工程。。。,俺在win732抓了两个。

TOP

C:\Windows\System32\cscript.exe
C:\Windows\System32\wscript.exe
估计 就是 此类文件吧,

感觉楼主是在 搞WINPE移植工程。。。,俺在win732抓了两个。

TOP

C:\Windows\System32\cscript.exe
C:\Windows\System32\wscript.exe
估计 就是 此类文件吧,

感觉楼主是在 搞WINPE移植工程。。。,俺在win732抓了两个。

TOP

C:\Windows\System32\cscript.exe
C:\Windows\System32\wscript.exe
估计 就是 此类文件吧,

感觉楼主是在 搞WINPE移植工程。。。,俺在win732抓了两个。

TOP

这是什么破IE9啊,ctrl+enter不起作用,回了那么多次。之后才知道。。。晕。

TOP

我们的口号是:
精干实用,绿色小巧,环保低炭。


============================
下载后,打开 WINCMD.INI

引用
LanguageIni=C:\Users\Administrator\Desktop\TC2\WCMD_CHN.LNG
Mainmenu=C:\Users\Administrator\Desktop\TC2\WCMD_CHN.MNU


路径 ,换成你的!
============================================================
运行TC并加载配置.cmd

引用
"C:\Users\Administrator\Desktop\TC2\TOTALCMD.EXE" /i="C:\Users\Administrator\Desktop\TC2\wincmd.ini"
同理也换成你的,                         -----》完事把此文件拖到桌面建立个快捷方式
--------------------》图标不好看?自己设个好看的图标
--------------------》有DOS窗口?hideexec.exe 加在 快捷方式路径前面

=============================================================


之后,再运行,就是中文的了。如上图所示,连语言目录都省了。

TOP

返回列表