标题: [求助]如何用软盘启动DOS7.1后,获得硬盘上WINXP/2K/2K3系统的安
[打印本页]
作者: yzz163
时间: 2004-9-19 00:00
标题: [求助]如何用软盘启动DOS7.1后,获得硬盘上WINXP/2K/2K3系统的安
我想写个批处理,自动复制故障机(不能启动的XP/2K/2K3机器)上的一些系统文件,如SYSTEM32目录下的一些文件,但不知道用何命令可找到XP/2K/2K3故障机的系统路径(安装目录)?
作者: Climbing
时间: 2004-9-20 00:00
如果你的系统没有安装在NTFS分区上,你可以从boot.ini中取得安装路径。
作者: yzz163
时间: 2004-9-20 00:00
你可以从boot.ini中取得安装路径。------------------------------十分感谢!我找了一个安装在c:\windows下的xp,它的boot.ini如下:[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect是用其中的“multi(0)disk(0)rdisk(0)partition(1)\WINDOWS”来判断吧?我的批处理功底很差,如何把上面的表示成DOS7.1可以识别的“路径”即c:\windows?如何写批处理?如何从BOOT.INI中提取这部分?如果系统不是安装在c:,又如何找到BOOT.INI?
作者: Climbing
时间: 2004-9-20 00:00
在DOS中,盘符与分区往往无法建立固定的联系,也就是说,你无法根据boot.ini中nt所在的分区来确定它在哪个盘符上。所以你写这个批处理,只能从boot.ini中取得你的NT系统安装在哪个目录下,例如在本例中,你的XP安装在Windows目录下,至于是当前的哪个盘符,你只好用穷举法来搜寻(有可能发生重复,例如:你的系统中安装了两套XP系统),方法如下:for %%I in (C D E F G H I J K L M N ...) do if exist %%I:\%windir%\system32\config\sam call backup.bat %%I总之,编写一个批处理不可能照顾到所有的情况,只能根据实际情况来进行调整。
作者: yzz163
时间: 2004-9-20 00:00
以前面为例,那如何从BOOT.INI中提取出\WINDOWS?
[此贴子已经被作者于2004-9-20 19:42:08编辑过]
作者: Climbing
时间: 2004-9-20 00:00
当然要用lmod了,呵呵,如下:type c:\boot.ini | find "Microsoft" | lmod /L1 /B()\= set wdir=[$9] > temp.bat
call temp.bat
del temp.bat
执行完成后,wdir中保存的就是WINDOWS或者WINNT(Windows安装目录的名字)。
作者: yzz163
时间: 2004-9-22 00:00
问题基本解决.再次感谢Climbing!--------------------------------------主程序:@ECHO OFF
CALL TestDrv.bat C D E F G H I J K L M N O P Q R S T U V W X Y Z
IF %SDrv%*==* GOTO errbootset wdir=
type %SDrv%:\boot.ini | find "Microsoft" | lmod /L1 /B()\= set wdir=[$9] > temp.bat
call temp.bat
del temp.batECHO SET WINDIR=%SDrv%:\%wdir% >TEMP.BAT
CALL TEMP.BAT
DEL TEMP.BAT :errboot
echo no system file: boot.ini !:exit
-----------------------------------------------TestDrv.bat子程序@ECHO OFF
SET SDrv=
:LOOP
DReady %1
IF NOT ERRORLEVEL 1 IF EXIST %1:\BOOT.INI GOTO FOUND
SHIFT
IF %1*==* GOTO END
GOTO LOOP:FOUND
SET SDrv=%1
:END-----------------------------------------------运行后,WINDIR即为我想要的"系统安装目录". 我从坛子里抄的一些,能给看看还有问题吗?如果是NTFS分区,是否只需加上NTFSPRO 包即可?这一句: lmod /L1 /B()\= set wdir=[$9] 可以解释一下吗?
作者: Climbing
时间: 2004-9-22 00:00
我觉得你写的还是有些问题,Boot.ini所在的分区不一定是Windows NT的安装分区,例如,有很多人将98安装在C:盘,然后将xp安装在D:盘,两者共用同一个主分区,这样,Boot.ini在C盘,但WINNT目录却是在D:盘,所以你的批处理运行肯定是有局限的。关于NTFS Pro,我不知道dready能不能处理NTFS Pro虚拟出来的盘符,你只好试一下了。lmod 的用法你可以查lmod的说明,在Horst的主页上可以下载到完整的说明。/L1: 是指第一行
/B()\= :以()\=作为元变量的分隔符
set wdir=[$9] : 其中的[$9]是指第9个元变量,也就是boot.ini中Windows目录名。
作者: yzz163
时间: 2004-9-25 00:00
我又加了一个"判断系统安装在哪一个驱动器上"的子程序TESTSYSD.BAT,枚举c-z,看是否有\SYSTEM32\CONFIG\SAM 文件来判断。
修改后的如下:
主程序:MAIN.BAT
@ECHO OFF
CALL TestBOOT.bat C D E F G H I J K L M N O P Q R S T U V W X Y Z
IF %BOOTDrv%*==* GOTO errboot
set WDIR=
type %BOOTDrv%:\boot.ini | tfind "Microsoft" | lmod /L1 /B()\= set wdir=[$9] > temp.bat
call temp.bat
del temp.bat
CALL TESTSYSD.BAT C D E F G H I J K L M N O P Q R S T U V W X Y Z
ECHO SET WINDIR=%SYSDrv%:\%WDIR% >TEMP.BAT
CALL TEMP.BAT
DEL TEMP.BAT
GOTO EXIT
:errboot
echo no system file: boot.ini !
:EXIT
-----------------------
子程序:TestBOOT.bat
@ECHO OFF
SET BOOTDrv=
:LOOP
DReady %1
IF NOT ERRORLEVEL 1 IF EXIST %1:\BOOT.INI GOTO FOUND
SHIFT
IF %1*==* GOTO END
GOTO LOOP
:FOUND
SET BOOTDrv=%1
:END
--------------------------
子程序:TESTSYSD.BAT
@ECHO OFF
SET SYSDrv=
:LOOP
DReady %1
IF NOT ERRORLEVEL 1 IF EXIST %1:\%WDIR%\system32\config\SAM GOTO FOUND
SHIFT
IF %1*==* ECHO "NOT FOUND SYSTEM FILES!"
EXIT
GOTO LOOP
:FOUND
SET SYSDrv=%1
:END
=======================================
变量含义:
BOOTDrv:BOOT.INI文件所在驱动器
SYSDrv:系统所在驱动器
WDIR:系统所在目录
WINDIR:系统所在驱动器+系统所在目录
[此贴子已经被作者于2004-9-25 12:13:27编辑过]
作者: 死性不改
时间: 2004-9-25 00:00
既然需要查找sam,那么何必通过boot.ini来判断呢?这不是多此一举?何况,如果双系统为2000+XP/2003那么既有winnt也有windows,你要那一个?如果你确定故障机只采用windows和winnt这些系统的默认目录,那么,一个确定sam文件路径的批处理,不就同时确定了系统的目录了吗?[em05]
作者: yzz163
时间: 2004-9-25 00:00
大师,你终于来了。我的批处理中考虑了:故障机不一定是采用windows和winnt这些系统的默认目录的。处理过程是,先找到BOOT.INI所在的盘,打开BOOT.INI用LMOD取系统的安装目录%WDIR%。然后再枚举所有可能的硬盘C-Z,看哪个盘上有%WDIR%\system32\config\SAM 文件来确定系统盘符%SYSDRV%。这样就可以得到最终的系统安装路径 :%SYSDRV%+%WDIR%。用该方法肯定有不可靠的地方,不知 不改大师 有何高招?
作者: 死性不改
时间: 2004-9-25 00:00
boot.ini中不一定有"Microsoft",有些人喜欢个性化。还不如用dir /b /s来直接获得文件路径,虽然执行速度可能会慢得多。
作者: Climbing
时间: 2004-9-26 00:00
如果用批处理要考虑各种特殊情况或者使用者的个性化,那干脆就不要写批处理了。用人工是可以适应任何情况的变化的。这很多时候也是无可奈何的事情。
作者: yzz163
时间: 2004-9-26 00:00
如果用批处理要考虑各种特殊情况或者使用者的个性化,那干脆就不要写批处理了。用人工是可以适应任何情况的变化的。这很多时候也是无可奈何的事情。
----------
不知哪有这种功能的程序呢?找到就好了,我就不写了。
我的批处理还有两个问题:
1是不改说的boot.ini中不一定有“Microsoft”,比如boot.ini被人为的修改过。(这种情况确实不好搞,还要对BOOT.INI文件的格式进一步分析)
2是装有两个以上的xp/2k/2k3.(这种情况,我只想找默认启动的即可)
[此贴子已经被作者于2004-9-26 11:27:59编辑过]
作者: Climbing
时间: 2004-9-26 00:00
如果你只想找默认启动项就简单了,因为你可以用“default=multi”作为find命令的关键字,不过还要修改一下lmod的参数。例如:type c:\boot.ini | find "default=multi" | lmod /L1 /B=()\ set wdir=[$10] > temp.bat
作者: 死性不改
时间: 2004-9-27 00:00
例如你要复制的文件名为hal.dll,ntoskrnl.exe,大概思路如下:dir /s /b X:\hal.dll>%temp%\copyl.txtdir /s /b X:\ntoskrnl.exe>>%temp%\copyl.txtfor /f %%i in (%temp%\copyl.txt) do echo copy %%i %ramd%:\>>%temp%\copyf.cmdcall %temp%\copyf.cmd当然X:需要枚举,如果文件路径带有空格,for /f 还得用usebackq参数。同时这个方案执行速度可能会比较慢,关键在于dir /s /b查找文件处,再有,你得考虑是否有两个相同文件名的文件存在等因素。
作者: Climbing
时间: 2004-9-27 00:00
而且如果同时安装了2000和xp(或者2003),也是一件很麻烦的事情。
作者: 死性不改
时间: 2004-9-27 00:00
另外,相信大部分人都是采用默认的windows/winnt目录,不妨先尝试直接copy文件,当执行出错时再进行判断处理。系统不是采用默认的安装目录,这本身就是一个个性化的表现,boot.ini里面没有Microsoft又有何奇怪?[em08][em08]
作者: Climbing
时间: 2004-9-27 00:00
没有Microsoft没有关系,Windows 2003默认就已经没有了,但肯定可以将boot.ini的安装目录提取出来。
作者: yzz163
时间: 2004-9-29 00:00
不该的方法也可以,但在有双系统情况下无法得知复制的是哪个系统的文件?最好的办法还是从boo.ini中提“系统目录”,如何从boo.ini中准确提取,还得“仔细”分析各种boo.ini文件。比如除了“Microsoft”还有没有其他关键字?可多找几个条件,这样判断就更准确了。希望有双系统的网友能把boot.ini文件放上来。
作者: ytlgdb
时间: 2004-9-30 00:00
问题:请问版主,我原先用超级mosdos7.10启动盘启动我的电脑(装winxp)时可以从三种状态下启动,没遇到什么问题。但是,自从我装了cd-row,却不能再从光盘启动了,不知这是为什么,请指教。(我把硬盘的跳线设定在主IDE通道的主位置,CD-ROW设定在主IDE通道的从位置;我把DVD设定在次IDE通道的主位置。从CMOS中查看,显示上述设定))
作者: 死性不改
时间: 2004-9-30 00:00
从boot.ini也不一定能确定是什么操作系统,你既然要考虑系统目录的个性化,就不能忽略boot.ini的个性化,准确的方法应该是从system32目录中的eula文件获得系统信息。我前面帖子中的copyf.cmd应该是copyf.bat。[em04]
作者: yzz163
时间: 2004-10-5 00:00
准确的方法应该是从system32目录中的eula文件获得系统信息。---------------------------------这是一台WINDOWS SERVER 2003 ENTERPRISE EDITION的eula文件前几行:MICROSOFT 软件最终用户许可协议MICROSOFT WINDOWS SERVER 2003, STANDARD EDITION
MICROSOFT WINDOWS SERVER 2003, ENTERPRISE EDITION请仔细阅读以下最终用户许可协议(《协议》)。一旦安装--------------------------------------------------这是一台WINDOWS XP PROFESSIONAL 的eula文件前几行:MICROSOFT WINDOWS XP PROFESSIONAL 最终用户许可协议重要须知-请认真阅读:-----------------------不知其他版本的是否也是这样。可以看出和版本有关的行都有关键字:MICROSOFT WINDOWS ,但WIN2003的STANDARD EDITION版和ENTERPRISE EDITION版无法区分。
作者: yzz163
时间: 2004-10-12 00:00
还有其的他文件可以"标识"操作系统的版本吗?
作者: Climbing
时间: 2004-10-12 00:00
如果一个批处理考虑到这么复杂的程度,几乎也就没有办法写下去了。