标题: [文本处理] 用.cmd 批处理脚本修改 wincmd.ini 配置文件 [打印本页]
作者: uhnmki 时间: 2013-8-2 11:57 标题: 用.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:这里发帖的页面编辑功能真棒,是我见过的最好的!!!
就是登录之后没分反而不能像游客那样到处看帖打印,有点越守法成本越高那意思。
作者: gawk 时间: 2013-8-2 14:34
- REM a=true 即表明已找到[left]节
- set a=false
- REM b=true 则表明已找到[right]节
- set b=false
- REM c=true 则表明已找到[LeftHistory]节
- set c=false
- REM d=true 则表明已找到[RightHistory]节
- set d=false
-
- REM e=true 即表明已完成[left]节中的 path= 字串替换
- set e=false
- REM f=true 则表明已完成[right]节中的 path= 字串替换
- set f=false
- REM g=true 则表明已完成[LeftHistory]节的 0= 字串替换
- set g=false
- REM h=true 则表明已完成[RightHistory]节的 0= 字串替换
- set h=false
-
- for /f "delims=" %%i in (%TEMP%\tcmd\wincmd.ini) do (
- set str=%%i
- setlocal enabledelayedexpansion
- REM [left]
- if "!a!" equ "false" (
- if "!str!" equ "[left]" set a=true
- ) else (
- if "!e!" equ "false" (
- if "!str:~0,5!" equ "path=" (
- set "str=path=%TEMP%\"
- set e=true
- )
- )
- )
-
- REM [right]
- if "!b!" equ "false" (
- if "!str!" equ "[right]" set b=true
- ) else (
- if "!f!" equ "false" (
- if "!str:~0,5!" equ "path=" (
- set "str=path=%TEMP%\tcmd\"
- set f=true
- )
- )
- )
-
- REM [LeftHistory]
- if "!c!" equ "false" (
- if "!str!" equ "[LeftHistory]" set c=true
- ) else (
- if "!g!" equ "false" (
- if "!str:~0,2!" equ "0=" (
- set "str=0=%TEMP%\"
- set g=true
- )
- )
- )
-
- REM [RightHistory]
- if "!d!" equ "false" (
- if "!str!" equ "[RightHistory]" set d=true
- ) else (
- if "!h!" equ "false" (
- if "!str:~0,2!" equ "0=" (
- set "str=0=%TEMP%\tcmd\"
- set h=true
- )
- )
- )
- endlocal
-
- >>%TEMP%\wincmd.tmp echo,!str!
- )
-
- move /y %TEMP%\wincmd.tmp %TEMP%\wincmd.ini
复制代码
作者: zz100001 时间: 2013-8-2 15:36
windows资源包有个iniman.exe,可以实现这些
作者: uhnmki 时间: 2013-8-12 13:28
本帖最后由 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亦可)。
以下是新程序:- REM %OP%为侦测得知的光盘盘符(本脚本存放在光盘上)。
- SET Var0=%0
- FOR /f "delims=" %%o in ("%Var0%") do Set OP=%%~dI
-
- REM a=true 即表明已找到[left]节
- REM b=true 则表明已找到[right]节
- REM c=true 则表明已找到[LeftHistory]节
- REM d=true 则表明已找到[RightHistory]节
-
- REM e=true 即表明已完成[left]节中的 path= 字串替换
- REM f=true 则表明已完成[right]节中的 path= 字串替换
- REM g=true 则表明已完成[LeftHistory]节的 0= 字串替换
- REM h=true 则表明已完成[RightHistory]节的 0= 字串替换
-
- REM i=true 则表明已找到[Packer]节
- REM j=true 后表明已完成[Packer]节的 RAR= 字串替换
-
- for /f "eol=,usebackq,tokens=*,delims=" %%k in (%TEMP%\tcmd\wincmd.ini) do (
- set str=%%k
- setlocal enabledelayedexpansion
- REM [left]
- if not defined a (if !str!=="[left]" set a=true
- ) else (if not defined e (if !str:~0,5!=="path=" (
- set "str=path=%TEMP%\"
- set e=true
- )
- )
- )
- REM [right]
- if not defined b (if !str!=="[right]" set b=true
- ) else (if not defined f (if !str:~0,5!=="path=" (
- set "str=path=%TEMP%\tcmd\"
- set f=true
- )
- )
- )
- REM [LeftHistory]
- if not defined c (if !str!=="[LeftHistory]" set c=true
- ) else (if not defined g (if !str:~0,2!=="0=" (
- set "str=0=%TEMP%\"
- set g=true
- )
- )
- )
- REM [RightHistory]
- if not defined d (if !str!=="[RightHistory]" set d=true
- ) else (if not defined h (if !str:~0,2!=="0=" (
- set "str=0=%TEMP%\tcmd\"
- set h=true
- )
- )
- )
- REM [Packer]
- if not defined i (if !str!=="[Packer]" set i=true
- ) else (if not defined j (if !str:~0,4!=="RAR=" (
- set "str=RAR=!OP!\PROGRAMS\SYSTEM\WINRAR\WINRAR.EXE"
- set j=true
- )
- )
- )
- endlocal
- echo,!str! >>%TEMP%\wincmd.tmp
- )
- 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吧。
这里编辑功能不错,但是怎么就没有预览功能呢?
作者: 我来了 时间: 2013-8-13 14:46
C:\Windows\System32\cscript.exe
C:\Windows\System32\wscript.exe
估计 就是 此类文件吧,
感觉楼主是在 搞WINPE移植工程。。。,俺在win732抓了两个。
作者: 我来了 时间: 2013-8-13 14:47
C:\Windows\System32\cscript.exe
C:\Windows\System32\wscript.exe
估计 就是 此类文件吧,
感觉楼主是在 搞WINPE移植工程。。。,俺在win732抓了两个。
作者: 我来了 时间: 2013-8-13 15:01
C:\Windows\System32\cscript.exe
C:\Windows\System32\wscript.exe
估计 就是 此类文件吧,
感觉楼主是在 搞WINPE移植工程。。。,俺在win732抓了两个。
作者: 我来了 时间: 2013-8-13 15:01
C:\Windows\System32\cscript.exe
C:\Windows\System32\wscript.exe
估计 就是 此类文件吧,
感觉楼主是在 搞WINPE移植工程。。。,俺在win732抓了两个。
作者: 我来了 时间: 2013-8-13 15:03
这是什么破IE9啊,ctrl+enter不起作用,回了那么多次。之后才知道。。。晕。
作者: 我来了 时间: 2013-8-15 18:58
我们的口号是:
精干实用,绿色小巧,环保低炭。
============================
下载后,打开 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 加在 快捷方式路径前面
=============================================================
之后,再运行,就是中文的了。如上图所示,连语言目录都省了。
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |