Board logo

标题: 请问什么软件可以通过分区卷标名称查找分区? [打印本页]

作者: walu     时间: 2004-4-7 00:00    标题: 请问什么软件可以通过分区卷标名称查找分区?

比如E盘的卷标是“BACKUP”,这个软件通过查找卷标“BACKUP”而找到E盘,而且
可以使其它软件如XXCOPY等向E盘复制文件。
请问有这样的软件吗?
作者: Kinglion     时间: 2004-4-7 00:00
还是自己动手、丰衣足食吧。
作者: Climbing     时间: 2004-4-7 00:00
只要用程序就没有很多东西不可以实现的。

我给你一个提示:
vol c: | grep drive | lmod /L1 set label=[$!] > temp.bat
call temp.bat
del temp.bat
echo %label%

上面所用到的命令你可以下载这个文件:
http://climbing.minidns.net/clone/dostools.zip
作者: walu     时间: 2004-4-7 00:00
Climbing兄,我的意思是:让电脑自动地寻找卷标是“BACKUP”的分区(一切都是自动),这个分区有可能是E盘有可能是F盘等,找到后调动XXCOPY将C盘的AA.TXT这个文件复制到这个分区。
这样怎样实现?
作者: Climbing     时间: 2004-4-8 00:00
自己动脑好好想一想,如果我手把手都告诉你了,你还会进步吗?我已经把最重要的部分告诉你了,余下的都是一些小操作,自己补足就行了。
作者: walu     时间: 2004-4-8 00:00
谢谢!那我再试试看。
问一个与本主题不同的问题:
用MS-DOS7.1启动盘可以向硬盘的主分区传送系统(用SYS或FORMAT /S方式),传送赛后该主分区就可以启动了。但PC-DOS7.10既没有SYS命令也没有FORMAT /S命令,请问怎样才能使用PC-DOS7.1传到主分区并使主分区启动?(单纯将IBMBIO等几个文件复制到主分区是不会启动的)
作者: Climbing     时间: 2004-4-8 00:00
嘿嘿,干嘛这么费劲,直接往你的7.1的启动盘上放上一个sys或者format命令不就完了,又没有多大。实在不行,可以用Bart的mkbt命令+文件复制的方法。
作者: walu     时间: 2004-4-8 00:00
MS-DOS的SYS和FORMAT在PC-DOS下是不能用的。
mkbt只能将制作可启动软盘,不支持硬盘分区。
怎么办?
作者: Climbing     时间: 2004-4-8 00:00
抱歉,我没有看清楚,原来你用的是PC-DOS,我从来没有用过PC-DOS,不太了解,不过任何DOS都不可能没有Sys和Format命令的,是你下载的版本有问题吧?

MKBT默认情况下确实是只能针对软盘操作,但如果加上-x参数,好象就可以对硬盘进行操作,你可以试一下。
作者: walu     时间: 2004-4-8 00:00
谢谢Climbing!
MKBT我曾用过加上-x参数,显示好象可以,但还是不能启动。
这个问题这里的版主WENGIER曾说过PC-DOS7.1是没有SYS命令的,PC-2000有但又不支持FAT32分区。
作者: Climbing     时间: 2004-4-8 00:00
如果是这样,不知道因为什么你一定要用pc-dos,不能用ms-dos 7.10吗?

其实,一个分区能够引导dos是很简单的:
1、引导扇区是对应dos系统的引导扇区。
2、分区是该dos系统可以访问的文件系统。
3、分区上有相应的dos系统文件(早期的dos系统要求这些系统文件一定要放到最前面,但后来好象逐渐没有这个限制了,不知道pc-dos有没有这个限制)。

按照这个步骤来解决问题吧。
作者: walu     时间: 2004-4-9 00:00


  Quote:
以下是引用Climbing在2004-4-7 13:35:44的发言:
只要用程序就没有很多东西不可以实现的。

我给你一个提示:
vol c: | grep drive | lmod /L1 set label=[$!] > temp.bat
call temp.bat
del temp.bat
echo %label%

上面所用到的命令你可以下载这个文件:
http://climbing.minidns.net/clone/dostools.zip

我实在想不到有什么命令可以通过label而找到分区。(怒我知识太贫)
比如,通过你的程序得知C盘的label是SYS,但这都我们肉眼所看到的呀,批处理又不会识别只要label是SYS就向它复制文件。我只知道批处理可以通过errorlevel来判断,不知怎样通过屏显(echo)来判断。
请再指点一下好吗?哪个命令可以通过屏显(echo)来判断?

作者: Climbing     时间: 2004-4-9 00:00
老大,I 服了 You,你就不能脑袋转个弯吗?

第一个文件IsReady.bat:
@echo off
dready %1 > nul
if errorlevel 1 goto _quit
if errorlevel 0 set drives=%1 %drives%

:_quit

第二个文件:ChkLabel.bat
@echo off
set chkdrv=%1
if "%chkdrv%"=="" goto _usage
vol %chkdrv% | grep drive | lmod /L1 set label=[$!] > temp.bat
call temp.bat
del temp.bat
set BackDrive=
if "%label%"=="BACKUP" set BackDrive=%chkdrv%
goto _quit

:_usage
echo Error: Bad command line parameters.
echo Usage: ChkLabel
echo For example: ChkLable E:

:_quit
set chkdrv=


第三个文件FindBack.bat:
@echo off
set drives=
for %%D in (C: D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: X: Y: Z DO Call IsReady %%D
set BackDrive=
for %%D in (%drives%) DO call ChkLabel.bat %%D
if not "%BackDrive%"=="" goto _found
goto _notfound

:_found
echo 找到Backup分区在盘符%BackDrive%,准备备份数据到该盘
copy FileToBackup %BackDrive%\
if exist %BackDrive%\FiletoBackup echo Backup Successfully!
goto _quit

:_notfound
echo Error: 我不能找到你的Backup分区!
pause

:_quit
set drives=
set BackDrive=
set label=


[此贴子已经被作者于2004-4-11 14:42:30编辑过]



作者: walu     时间: 2004-4-9 00:00
哎呀,你才是老大呀,不是我的脑袋不转弯,这么复杂的批处理,我真的不会呀。我也是要工作的,没学过电脑知识,平时又没那么多时间研究,嘿嘿,只好“拿来主义”了
真的谢谢你!

作者: walu     时间: 2004-4-9 00:00
Climbing兄,这个对你来说很简单对我很复杂的批处理运行出错,显示“Error: 我不能找到你的Backup分区!”三个文件dready、grep、lmod 都准备好的。整个批处理都粘贴上去的,只是改了COPY文件的名称。你有测试过吗?
作者: walu     时间: 2004-4-9 00:00
我查了一下,应该是第二个文件中的 if "%lable%"=="BACKUP" set BackDrive=%1
出错,我是这样试的(换了一点): if "%lable%"=="BACKUP" goto yes  然后它不会跳到YES段。不知对否?

作者: Climbing     时间: 2004-4-10 00:00
你要确认你的分区的卷标确实是BACKUP,你可以单独测试这几个批处理文件的每一行命令是否工作正常(将批处理前面的@echo off)去掉,然后运行时查看运行的命令行及结果就可以诊断出故障原因了。

我只是根据理论上的可行性写了这么几个批处理文件,我并没有亲自测试,因为我用不到。
作者: walu     时间: 2004-4-10 00:00
按照你的分析方法分析了一下,果然出错的是
if "%lable%"=="BACKUP" set BackDrive=%1
这一行,无论ChkLabel哪个分区,也不管分区卷标是什么,这一行都是返回同样的结果。

如C盘的卷标是SYS,ChkLabel C:  后,变成
if "%lable%"=="BACKUP" set BackDrive=c:
如果D盘卷标是SOFT,ChkLabel D:  后,变成
if "%lable%"=="BACKUP" set BackDrive=d:

所以这个问题又回到了我最初提出的“通过你的程序得知C盘的label是SYS,但这都我们肉眼所看到的呀,批处理又不会识别只要label是SYS就向它复制文件”

这个文件(即以下几行)

vol %1 | grep drive | lmod /L1 set label=[$!] > temp.bat
call temp.bat
del temp.bat
set BackDrive=                            ←这一行倒是会正确显示卷标
if "%lable%"=="BACKUP" set BackDrive=%1   ←实际这一行是根本是不起作用的



作者: Climbing     时间: 2004-4-11 00:00
兄弟呀,我粗心犯些错误也是难免的,难道你就不能认真一些?你有没有发觉上面的最后一句:
if "%lable%"=="BACKUP" set BackDrive=%1

中有一个明显的错误,那就是将%label%错写成了%lable%,我当时因为着急打错了,而你调试了这么长时间竟然没有发现,真不知道你是怎么调试的。

我重新修改了前面帖子中写的ChkLabel.bat,你再用新的试一下。
作者: walu     时间: 2004-4-11 00:00
错误依旧,if "%lable%"=="BACKUP" set BackDrive=%1  这一行,无论ChkLabel哪个分区,也不管分区卷标是什么,这一行都是返回同样的结果。
作者: Climbing     时间: 2004-4-12 00:00
你的错误仍然没有改正过来,我晕。

看我前面的帖子好吗?
作者: cdl     时间: 2004-4-12 00:00
diskedit是个好工具
作者: Climbing     时间: 2004-4-12 00:00
没看清题意请不要乱灌。
作者: walu     时间: 2004-4-12 00:00
if "%lable%"=="BACKUP" set BackDrive=%1  
这是我发帖时粘原来的,我测试时是用
if "%label%"=="BACKUP" set BackDrive=%1  
测试结果真的和原来一样的错误
作者: Climbing     时间: 2004-4-12 00:00
你翻回去看我前面的帖子吗?我修改过了,使用另一种形式就行操作,你再用新的ChkLabel.bat试一下。
作者: Climbing     时间: 2004-4-12 00:00
打开附件

非逼着我亲自试一下(不过亲自试的过程中确实发现了批处理中的一些小bug,但方案绝对是可行的),上面的附件就是最后的结果。

将附件下载下去,然后解开,共有三个批处理文件:
IsReady.bat
ChkLabel.bat
FindBack.bat

其实,FindBack.bat应该改成FindLbl.bat。

用法:假设你要找一个分区卷标为backup的盘符,则输入以下命令:
FindBack backup

另外,你可以自己修改FindBack.bat中_found段的内容,在找到该盘符后做某个操作。
经过完善,在输入卷标时不用关心大写小写,批处理中会自动将卷标全部转换成大写进行比较。

上述程序在Windows xp的DOS方式下测试通过,其它环境未加测试(因为也没有别的环境)。
作者: Climbing     时间: 2004-4-12 00:00
注意,上述批处理文件只能运行在英文系统中才能正确找到卷标,如果vol命令是中文提示,还要再对批处理文件进行适当修改。我刚才发觉在中文的Windows 2000中运行Vol命令运行结果为:
C:\>vol c:
驱动器 C 中的卷是 HDA1_W2KP
卷的序列号是 0000-8DFE

而在我的Windows XP英文版运行相同的命令运行结果却是:
d:\TEMP>vol c:
Volume in drive C is HDA3_XPEN
Volume Serial Number is 3CE3-C65F

运行结果有明显的区别,一个为中文提示,一个为英文提示,而我上面提供的批处理文件只能正确运行于英文提示下,如果是中文提示,需要修改ChkLable.bat中的这一行:
vol %chkdrv% | grep drive | lmod /L1 [$!] | lmod /L1 set label=[U] > temp.bat

将上面一行中的grep drive修改为grep 驱动器(也是理论上的,因为没有测试),即:
vol %chkdrv% | grep 驱动器 | lmod /L1 [$!] | lmod /L1 set label=[U] > temp.bat
作者: Climbing     时间: 2004-4-12 00:00
在win2000中文版下又试了一下,由于lmod不支持中文代码页,所以在运行lmod后提示会变成英文,所以不存在上面帖子所述的兼容性问题,但FindBack.bat还是要进行适当的修改,修改成下面这样(其中加黑的那一行为新增内容,其它行没有变化):
@echo off
SET ToFind=%1

:: 下面一行定义你要查找的分区卷标
if "%ToFind%"=="" set ToFind=BACKUP

lmod > nul

echo %ToFind% | lmod /L1 set ToFind=[U] > temp.bat
call temp.bat
del temp.bat

set drives=
for %%D in (C: D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: X: Y: Z DO Call IsReady %%D
set BackDrive=
for %%D in (%drives%) DO call ChkLabel.bat %%D
if not "%BackDrive%"=="" goto _found
goto _notfound

:_found
echo 找到%ToFind%分区在盘符%BackDrive%,准备对该盘进行操作
echo Found %ToFind% Partition at Drive %BackDrive%, prepare to operate on it.
::下面定义你自己的操作
::copy FileToBackup %BackDrive%\
::if exist %BackDrive%\FiletoBackup echo Backup Successfully!
goto _quit

:_notfound
echo Error: 我不能找到你的%ToFind%分区!
echo Error: I cannot find the "%ToFind%" Partition.
pause

:_quit
set drives=
set BackDrive=
set label=
set ToFind=

作者: walu     时间: 2004-4-12 00:00
谢谢 Climbing 的热心与耐心!
原来你的批处理是在WINDOWS下运行的,弄得我一直在虚拟机的纯DOS下测试,怪不得得到的结果与你不同。呵呵,虽然现在也用不着,但 Climbing 兄的这种热心耐心实在令人钦佩!
作者: Climbing     时间: 2004-4-13 00:00
我的批处理不止是可以运行于Windows下,在纯dos环境中也没有问题的,上午刚试过了。
作者: hzy     时间: 2006-2-23 02:37
翻一翻旧帖,哪位能再提供一下这几个文件:dready、grep、lmod
作者: linuxth     时间: 2006-4-18 10:00
测试一下。
for %%D in (C: D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: X: Y: Z: DO Call IsReady %%D

for %%D in (C: D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: X: Y: Z:) DO Call IsReady %%D
作者: linuxth     时间: 2006-4-18 10:01
:)  z:)
作者: logan0279     时间: 2007-12-30 17:50
@ECHO OFF
for %%D in (A: B: C: D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: X: Y: Z:) DO VOL %%D |FIND "BACKUP" && SET BACKUPDRIVE=%%D && GOTO FOUND

:NOT_FOUND
ECHO ERROR:找不到BACKUP所在分区
PAUSE
EXIT

:FOUND
ECHO 已经找到BACKUP在%BACKUPDRIVE%分区,准备对该盘进行操作
......
EXIT

似乎这么几行就可以了!