Board logo

标题: [已结]怎么使用批处理修改 Boot.ini 中启动项的参数 [打印本页]

作者: maotao     时间: 2006-6-7 23:38    标题: [已结]怎么使用批处理修改 Boot.ini 中启动项的参数
比如我的 BOOT.INI 是这样的
[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 ]

作者: Climbing     时间: 2006-6-8 01:00
无忧的老毛桃?嘿嘿,世界太小了啊。 不过在发帖求助前还是建议你先看一下版规,至少要讲清楚你这个批处理的运行环境。 简单的方法(我一般只会用简单的方法,复杂的脑子不好使了),你可以下载一个第三方的dos软件,叫change.exe,然后研究一下它的用法(change /?)就行了。 复杂的恐怕就要用到find、findstr这一类的东东,而且还要经过复杂的其它处理才能完成任务,NND,要是微软提供一个内置的sed,这事儿就忒简单了。

作者: Climbing     时间: 2006-6-8 01:07
嗯,突然想到,如果灵活运行bootcfg命令,可能会使这个操作更简单。

作者: willsort     时间: 2006-6-8 10:53
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 ]

作者: Climbing     时间: 2006-6-8 11:17
高明,实在是高明!wil兄,佩服之至啊。

作者: piziliu2004     时间: 2006-6-8 14:03    标题: 批處理命令獵建復詳解其區別
"!!" 例子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

作者: piziliu2004     时间: 2006-6-8 15:23    标题: 批處理命令連結符,管道之類的詳解其區別
批處理命令連結符,管道之類的詳解其區別 up

作者: bagpipe     时间: 2006-6-8 17:36
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

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

作者: maotao     时间: 2006-6-10 21:15
Originally posted by Climbing at 2006-6-8 01:00: 无忧的老毛桃?嘿嘿,世界太小了啊。 不过在发帖求助前还是建议你先看一下版规,至少要讲清楚你这个批处理的运行环境。 简单的方法(我一 ...
呵呵,正是在下。对于版规,不好意思,我第一次来 DOS 联盟,没有看清楚,无忧论坛有人发帖子求助关于 Boot.INI 修改的问题,我就赶着来这里发帖子求助了,如有违反版规之处,还请斑竹谅解。
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 兄回复。在这方面,老毛桃一点都不在行,先谢谢了!

作者: willsort     时间: 2006-6-10 22:03
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

作者: namejm     时间: 2006-6-10 22:08
  在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 ]

作者: maotao     时间: 2006-6-10 22:36
Originally posted by willsort at 2006-6-10 22:03: Re maotao: 对于避免重复修改的问题,再加一个反向的find应该就可以了。代码如下,如果还有其他的指正或需求,欢迎继续指出,也欢迎兄多来迠...
感谢 Willsort 兄的再次帮助,我想这下可以解决在无忧发帖求助的那位朋友的问题了。 呵呵,初来 DOS 联盟,得到 Willsort 雄的帮助,甚是感激!以后老毛桃有需要帮助的地方可就不客气了哈!

作者: willsort     时间: 2006-6-11 16:54
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

作者: maotao     时间: 2006-6-13 00:35
呵呵,这下算是长见识了,果然不错!

作者: lxmxn     时间: 2006-10-29 02:09
Originally posted by willsort at 2006-6-11 16:54: :: 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
  看了一下willsort兄写的代码,写得的确不错,但是对里面的某一个语句难免会感到质疑,特别是"copy %temp%\boot.new boot.ini>nul 2>nul"这一句。   不难看出,以上willsort兄写的批处理要在系统盘根目录中运行,而这段代码中并没有删除"boot.ini"文件的语句,但是后面的这句让我感到质疑:"copy %temp%\boot.new boot.ini>nul 2>nul",这里会把"%temp%\boot.new" copy 到当前的工作目录中来,也就是 copy 到系统盘的根目录中来,并且将文件名改为"boot.ini",而此时系统盘的根目录里面已经有了一个"boot.ini"文件,这时 copy 命令就要询问你是否改写原来的"boot.ini"文件,而willsort兄只是简单的在后面加上">nul 2>nul"这个屏蔽的语句,这样一来,系统就好象死锁在一种询问的状态,当然CMD窗口并没有任何的提示。这显然没有达到我们的目的,结果显然是 copy 失败了。   以上只是我对willsort兄所写的批处理里面的一条语句的一点小小的质疑,如果小弟有什么地方弄错了,还请大伙及willsort兄见谅。 [ Last edited by lxmxn on 2006-10-29 at 02:13 AM ]

作者: 0451lym     时间: 2006-10-31 10:44
Originally posted by maotao at 2006-6-10 21:15: 我也翻阅了 Bootcfg 的帮助,确实没有添加自定义开关的选项。
XP 下最简单的方式: bootcfg /raw "/Kernel=Kernel.exe " /id 1 bootcfg /raw:以字符串形式在 Boot.ini 文件的 [operating systems] 区段中向操作系统项添加指定的操作系统加载项。 /id 1: 指定在 Boot.ini 文件的 [operating systems]区段内要更新的操作系统项的行号。[operating systems] 标题区域后的首行是 1。 "/Kernel=Kernel.exe ":?????? 呵呵! [ Last edited by 0451lym on 2006-10-31 at 10:56 AM ]

作者: chen004     时间: 2006-10-31 21:25    标题: 高手
我可看不懂??????????

作者: maotao     时间: 2006-11-1 08:38
Originally posted by 0451lym at 2006-10-31 10:44: XP 下最简单的方式: bootcfg /raw "/Kernel=Kernel.exe " /id 1 bootcfg /raw:以字符串形式在 Boot.ini 文件的 [operating systems] 区段中向操作系统顠...
这样似乎不行吧,你再到 Boot.ini 中看看,该系统菜单项原来的一些开关项是不是没了?

作者: 0451lym     时间: 2006-11-1 20:10
Originally posted by maotao at 2006-11-1 08:38: 这样似乎不行吧,你再到 Boot.ini 中看看,该系统菜单项原来的一些开关项是不是没了?
Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp. D:\Documents and Settings\Administrator>bootcfg /raw "/Kernel=Kernel.exe " /id1 成功: 在 Boot.ini 文件中的操作系统项目"1"上添加了开关。 D:\Documents and Settings\Administrator>c 我的BOOT.INI更改为: [boot loader] timeout=5 default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="☆我的办公系统☆" /kernel=kernel.exe multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="★我的备用系统★" /noexecute=optin /fastdetect C:\grldr="我的镜像恢复系统 → 06金秋版!"

作者: 0451lym     时间: 2006-11-1 20:25
刚看明白你的意思,你这样弄: bootcfg /raw "/noexecute=optin /fastdetect/Kernel=Kernel.exe " /id 1 “”中的开关多少都可以,把想要得加全了就可以了! D:\Documents and Settings\Administrator>bootcfg /raw "/noexecute=optin /fastdet ect/Kernel=Kernel.exe " /id 1 成功: 在 Boot.ini 文件中的操作系统项目"1"上添加了开关。 D:\Documents and Settings\Administrator> 我的BOOT.INI更改为: [boot loader] timeout=5 default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="☆我的办公系统☆" /noexecute=optin /fastdetect/kernel=kernel.exe multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="★我的备用系统★" /noexecute=optin /fastdetect C:\grldr="我的镜像恢复系统 → 06金秋版!"

作者: maotao     时间: 2006-11-1 21:03
Originally posted by 0451lym at 2006-11-1 20:25: 刚看明白你的意思,你这样弄: bootcfg /raw "/noexecute=optin /fastdetect/Kernel=Kernel.exe " /id 1 “”中的开关多少都可以,把想要得加全了就可以了..
这样是没有问题了,不过还得先了解原先的一些开关才可以这样的,假如原来的参数不是这样,。。。

作者: 0451lym     时间: 2006-11-1 23:12
Originally posted by maotao at 2006-11-1 21:03: 这样是没有问题了,不过还得先了解原先的一些开关才可以这样的,假如原来的参数不是这样,。。。
XP默认的开关就是那几个,没必要把许多垃圾开关都加上吧? 问题简单的好,不要复杂!

作者: namejm     时间: 2006-11-1 23:31
  maotao 是想把系统盘改造成个性化的,XP的默认设置并不能满足个性化需求——高手一般都喜欢DIY的,也没有几个高手在使用MS的原版安装光盘。

作者: newaifi     时间: 2006-11-2 01:54
收益非浅.. 本人在此也不再赘述了..

作者: voiL     时间: 2006-11-5 02:32
这个对偶也有用,先收了,再轻轻地顶一下.

作者: jasonwang     时间: 2006-11-9 02:52
17楼说的对,不过如何判断是ID1?似乎加上一些批处理似乎为好。

作者: different     时间: 2007-1-15 16:43    标题: 将楼主的问题逆向,如何做?
我现在想使用批处理找到里面的 multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /execute /fastdetect /Kernel=Kernel.exe 这一行,并且能够在这行的末尾减少字符串,比如修改成 multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /execute /fastdetect 也想只用XP系统自带的功能,不用外部工具。

作者: wanyu555     时间: 2007-1-17 12:47
各位大大实在是太帅了

作者: gocndos     时间: 2007-1-21 01:23
学习下

作者: qzwqzw     时间: 2007-1-21 01:45
Originally posted by lxmxn at 2006-10-28 13:09:   不难看出,以上willsort兄写的批处理要在系统盘根目录中运行,而这段代码中并没有删除"boot.ini"文件的语句,但是后面的这句让我感到质疑:"copy %temp%\boot.new boot.ini>nul 2>nul",这里会把"%temp%\boot.new" copy 到当前的工作目录中来,也就是 copy 到系统盘的根目录中来,并且将文件名改为"boot.ini",而此时系统盘的根目录里面已经有了一个"boot.ini"文件,这时 copy 命令就要询问你是否改写原来的"boot.ini"文件,而willsort兄只是简单的在后面加上">nul 2>nul"这个屏蔽的语句,这样一来,系统就好象死锁在一种询问的状态,当然CMD窗口并没有任何的提示。这显然没有达到我们的目的,结果显然是 copy 失败了。
这就是经验多少的问题了 你如何实际测试过这段代码的话 就会明白其中的奥妙 copy 有一个控制是否覆盖同名文件的开关 /y 在命令行下这个开关缺省关闭 在批处理中这个开关缺省开启 所以在批处理中copy是不需要/y开关的 除非有环境变量copycmd,并且指定了/-y的值

作者: lzys     时间: 2007-5-18 05:13
学习了,都是高人啊。。呵呵