中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]怎么使用批处理修改 Boot.ini 中启动项的参数
« [1] [2] [3] »
作者:
标题: [已结]怎么使用批处理修改 Boot.ini 中启动项的参数 上一主题 | 下一主题
maotao
初级用户





积分 44
发帖 14
注册 2006-6-7
状态 离线
『楼 主』:  [已结]怎么使用批处理修改 Boot.ini 中启动项的参数

比如我的 BOOT.INI 是这样的

  Quote:
[boot loader]
timeout=1
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /execute /fastdetect
C:\Avldr.bin="Windows XPE  By:老毛桃"
C:\GRLDR="GRUB 启动"

我现在想使用批处理找到里面的

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /execute /fastdetect

这一行,并且能够在这行的末尾添加字符串,比如修改成

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /execute /fastdetect /Kernel=Kernel.exe

我是个新手,恳请各路高手不吝赐教,还希望别笑话我。

[ Last edited by willsort on 2006-6-10 at 22:48 ]

2006-6-7 23:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 2 楼』:  

无忧的老毛桃?嘿嘿,世界太小了啊。

不过在发帖求助前还是建议你先看一下版规,至少要讲清楚你这个批处理的运行环境。

简单的方法(我一般只会用简单的方法,复杂的脑子不好使了),你可以下载一个第三方的dos软件,叫change.exe,然后研究一下它的用法(change /?)就行了。

复杂的恐怕就要用到find、findstr这一类的东东,而且还要经过复杂的其它处理才能完成任务,NND,要是微软提供一个内置的sed,这事儿就忒简单了。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2006-6-8 01:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 3 楼』:  

嗯,突然想到,如果灵活运行bootcfg命令,可能会使这个操作更简单。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2006-6-8 01:07
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 4 楼』:  

Re maotao:

      下面的代码在CMD下运行可以完成对当前路径下boot.ini进行相应的修改。

      另外,大略翻阅了bootcfg的帮助文档,可能有用的开关 /Addsw 只能为boot.ini添加有限的几个固定开关,其中/kernel并不包括在内。
@echo off
if exist boot.new del boot.new
if not exist boot.ini goto :eof
for /f "delims=" %%l in (boot.ini) do (
    echo.%%l | find/i "/fastdetect">nul && echo %%l /kernel=kernel.exe||echo %%l
)>>boot.new
attrib -s -h -r boot.ini
copy boot.new boot.ini>nul
attrib +s +h +r boot.ini
[ Last edited by willsort on 2006-6-8 at 10:57 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-8 10:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 5 楼』:  

高明,实在是高明!wil兄,佩服之至啊。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2006-6-8 11:17
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
piziliu2004
中级用户

过度热情


积分 321
发帖 139
注册 2006-3-21
状态 离线
『第 6 楼』:  批處理命令獵建復詳解其區別

"!!" 例子for /f %%i in (3.txt) do set str=!str!%%i  如題!str!表示str變量那為什麼不能用%str%.
"|" ,"||","&","&&" 經常看到批處理裡面有這幾個連接符號.具體實現的功能是什麼?我這裡有點搞混消了.迷迷糊糊的.!

以willsort版主 寫的批處理為例: 麻煩解釋解釋其中的奧秘.以下批處理真的很經典喔.!
for /f "delims=" %%l in (boot.ini) do (
    echo.%%l | find/i "/fastdetect">nul && echo %%l /kernel=kernel.exe||echo %%l
)>>boot.new

   此帖被 -8 点积分      点击查看详情   


2006-6-8 14:03
查看资料  发送邮件  发短消息 网志  OICQ (16750931)  编辑帖子  回复  引用回复
piziliu2004
中级用户

过度热情


积分 321
发帖 139
注册 2006-3-21
状态 离线
『第 7 楼』:  批處理命令連結符,管道之類的詳解其區別

批處理命令連結符,管道之類的詳解其區別
up

2006-6-8 15:23
查看资料  发送邮件  发短消息 网志  OICQ (16750931)  编辑帖子  回复  引用回复
bagpipe
银牌会员

DOS联盟捡破烂的


积分 1144
发帖 425
注册 2005-10-20
来自 北京
状态 离线
『第 8 楼』:  

for /f "delims=" %%l in (boot.ini) do (
    echo.%%l | find/i "/fastdetect">nul && echo %%l /kernel=kernel.exe||echo %%l
)>>boot.new

这段代码的主要作用就是 检索BOOT.INI文件的每行,如果发现有/fastdetect的行就在这行的后面加上/kernel=kernel.exe这个参数,然后把文件保存为boot.new,如果没有发现/fastdetect这行,就把整个的BOOT.INI文件内容保存为boot.new文件,如下:


如果BOOT.INI原文件是
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /kernel=kernel.exe
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional" /fastdetect /kernel=kernel.exe
这样我想楼主应该看出不同之处了吧。如果没有/fastdetect那么boot.new 文件的内容应该跟原BOOT.INI内容一样。


解释:echo.%%l | find/i "/fastdetect">nul && echo %%l /kernel=kernel.exe||echo %%l这句

|管道字符,表示第一条命令的输出作为第二条命令的输入,也就是显示echo %%i的内容作为find /i 查找的内容。

>nul表示执行这条命令不显示正常输出

&&表示如果前面的命令成功执行那么就执行后面的语句,如果执行不成功那就不执行后面的语句

||这个表示如果前面的执行的语句失败就执行这句,例如如果文件中没有/fastdetect字符存在的行,那么就执行 echo %%i ,如果前面的命令都执行成功就不执行这句了,唉,打字真累,大概的就这些了 ...........


流泪而去.............




那么执行完毕后应该是:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional" /fastdetect

2006-6-8 17:36
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 9 楼』:  


───────────────── 版务记录 ─────────────────
执行:Will Sort
操作:合并主题 {21100} 批處理命令獵建復詳解其區別 -> 6,7,8楼
说明:操作主题与本主题存在上下文的直接联系
处罚:扣除8点积分,包括发表该主题而奖励的6分和主题重复惩罚性扣除的2分
───────────────── 版务记录 ─────────────────




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-8 20:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
maotao
初级用户





积分 44
发帖 14
注册 2006-6-7
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by Climbing at 2006-6-8 01:00:
无忧的老毛桃?嘿嘿,世界太小了啊。

不过在发帖求助前还是建议你先看一下版规,至少要讲清楚你这个批处理的运行环境。

简单的方法(我一 ...

呵呵,正是在下。对于版规,不好意思,我第一次来 DOS 联盟,没有看清楚,无忧论坛有人发帖子求助关于 Boot.INI 修改的问题,我就赶着来这里发帖子求助了,如有违反版规之处,还请斑竹谅解。

  Quote:
Originally posted by willsort at 2006-6-8 10:53:
Re maotao:

      下面的代码在CMD下运行可以完成对当前路径下boot.ini进行相应的修改。

      另外,大略翻阅了bootcfg的帮助文档,可能有用的开关 /Add ...

感谢 WillSort 兄的回复。我也翻阅了 Bootcfg 的帮助,确实没有添加自定义开关的选项。关于 Climbing 斑竹推荐的第三方软件 change.exe。老毛桃用过,确实好用。但我只是想尝试一下,用批处理不借助第三方软件到底能不能实现。

Will 兄的代码简洁高效,老毛桃深感佩服,真的得好好学习一下。不过能不能好人做到底,再帮一个忙,就是,如果现在的系统开关已经有了 /kernel=kernel.exe,怎么处理呢?还望 Will 兄回复。在这方面,老毛桃一点都不在行,先谢谢了!

2006-6-10 21:15
查看资料  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 11 楼』:  

Re maotao:

      对于避免重复修改的问题,再加一个反向的find应该就可以了。代码如下,如果还有其他的指正或需求,欢迎继续指出,也欢迎兄多来这里大家互相交流经验。

     9楼的版务操作对象是6楼的piziliu2004的,倒让兄受惊了 :)
@echo off
if exist boot.new del boot.new
if not exist boot.ini goto :eof
for /f "delims=" %%l in (boot.ini) do (
    echo.%%l | find/i "/fastdetect" | find /v /i "/kernel">nul && echo %%l /kernel=kernel.exe||echo %%l
)>>boot.new
attrib -s -h -r boot.ini
copy boot.new boot.ini>nul
attrib +s +h +r boot.ini




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-10 22:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 12 楼』:  

  在willsort代码的基础上加入判断语句就可以满足需要了:
@echo off
if exist boot.new del boot.new
if not exist boot.ini goto :eof
for /f "delims=" %%l in (boot.ini) do (
    echo.%%l | find /i "/kernel=kernel.exe">nul && goto :eof
    echo.%%l | find /i "/fastdetect">nul && echo %%l /kernel=kernel.exe||echo %%l
)>>boot.new
attrib -s -h -r boot.ini
copy boot.new boot.ini>nul
attrib +s +h +r boot.ini
  回复完的时候,发现willsort已经给出一个方案了,呵呵,那我就加点口水话再发上来吧。

[ Last edited by namejm on 2006-6-10 at 22:12 ]

2006-6-10 22:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
maotao
初级用户





积分 44
发帖 14
注册 2006-6-7
状态 离线
『第 13 楼』:  



  Quote:
Originally posted by willsort at 2006-6-10 22:03:
Re maotao:

      对于避免重复修改的问题,再加一个反向的find应该就可以了。代码如下,如果还有其他的指正或需求,欢迎继续指出,也欢迎兄多来迠...

感谢 Willsort 兄的再次帮助,我想这下可以解决在无忧发帖求助的那位朋友的问题了。

呵呵,初来 DOS 联盟,得到 Willsort 雄的帮助,甚是感激!以后老毛桃有需要帮助的地方可就不客气了哈!

2006-6-10 22:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 14 楼』:  

Re maotao:

      因为考虑到脚本要应用到实际项目中,再加之 boot.ini 的重要性,因此尽量考虑了各个操作环节,增加了操作状态判断和提示。大家也可以再检查一下,脚本是否遗漏了某些环节未做处理。

      可以看到,这一版的脚本与前两版相比,复杂了许多,但基本算法仍然未变,这就是代码工程化所必然会带来的影响。
:: ModBoot.cmd - V3 - Modify of boot.ini
:: Will Sort - 2006-6-11 - CMD@WinXP
@echo off
if not exist boot.ini echo Not found boot.ini!&goto :eof
if exist %temp%\boot.new del /f /a %temp%\boot.new
find/i "/kernel=" boot.ini>nul && echo Modified boot.ini! && goto :eof
for /f "delims=" %%l in (boot.ini) do (
    echo.%%l | find/i "/fastdetect" >nul && echo %%l /kernel=kernel.exe || echo %%l
)>>%temp%\boot.new
find/i "/kernel" %temp%\boot.new>nul 2>nul
if errorlevel 1 echo Fail to parse boot.ini!&goto :eof
attrib -s -h -r boot.ini
copy boot.ini %temp%\boot.bak>nul&&echo Pass to backup boot.ini.
copy %temp%\boot.new boot.ini>nul 2>nul
find/i "/kernel" boot.ini>nul 2>nul
if not errorlevel 1 echo Pass to wrtie boot.ini.
if errorlevel 1 copy %temp%\boot.bak boot.ini>nul & echo Fail to wrtie boot.ini!
attrib +s +h +r boot.ini
del %temp%\boot.new & del %temp%\boot.bak




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-11 16:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
maotao
初级用户





积分 44
发帖 14
注册 2006-6-7
状态 离线
『第 15 楼』:  

呵呵,这下算是长见识了,果然不错!

2006-6-13 00:35
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: