标题: 请教,纯DOS下如何获取当前盘符?
[打印本页]
作者: logan0279
时间: 2007-12-21 14:16
标题: 请教,纯DOS下如何获取当前盘符?
如题,在纯DOS下如何获取当前盘符并输入到某文件中呢?
论坛里搜出来的那篇帖子里的方法都已经试过了,在XP下可以成功,但在纯DOS下却不能成功!出错提示如下:
Sector not found reading drive c.
[
Last edited by logan0279 on 2007-12-21 at 02:22 PM ]
作者: lianjiang2004
时间: 2007-12-21 18:13
我的笨办法。
当前盘下,dir ttt.ttt>1.txt
然后处理1.txt文件。
作者: Climbing
时间: 2007-12-21 21:39
echo exit | %comspec% /k prompt set curdrv=$N:$_ | find "set" > tmp.bat
call tmp.bat
echo %curdrv%
这是当年willsort版主发明的解决方案,在置顶的精华帖子汇总中就有。原帖链接如下:
http://www.cn-dos.net/forum/viewthread.php?tid=13813
作者: chishingchan
时间: 2007-12-22 00:24
Quote: |
echo exit | %comspec% /k prompt set curdrv=$N:$_ | find "set" > tmp.bat
call tmp.bat
echo %curdrv% |
|
如果无需生成过渡文件就最理想了。
作者: lianjiang2004
时间: 2007-12-22 08:09
当前盘符不可写时就不行了。
作者: logan0279
时间: 2007-12-22 08:36
其实我是想做一个U盘启动盘,考虑到U盘在某些机子上识别为A盘,在另一些机子上识别为C盘,为了更好地执行U盘上的程序,所以才有此一问的!
不知道各位有没有更好的办法呢?
作者: Climbing
时间: 2007-12-22 08:40
既然U盘的盘符要么是C:,要么是A:,你直接在U盘上放置一个标志文件,先检测C:下是否有这个标志文件,如果没有,那么盘符就是A:了。
作者: lianjiang2004
时间: 2007-12-22 08:51
Quote: |
Originally posted by Climbing at 2007-12-22 08:40:
既然U盘的盘符要么是C:,要么是A:,你直接在U盘上放置一个标志文件,先检测C:下是否有这个标志文件,如果没有,那么盘符就是A:了。 |
|
我现在就是这样处理的,实在没办法。
U盘可写还好办,遇上不可写的,一判断就会出错,只好用特征文件了。尽管不能保证万无一失。但简单多了。
作者: chishingchan
时间: 2007-12-22 13:36
Quote: |
Originally posted by logan0279 at 2007-12-22 08:36 AM:
其实我是想做一个U盘启动盘,考虑到U盘在某些机子上识别为A盘,在另一些机子上识别为C盘,为了更好地执行U盘上的程序,所以才有此一问的!
不知道各位有没有更好的办法呢? |
|
无须指定盘符试试,且通用。
作者: logan0279
时间: 2007-12-22 19:09
不指定盘符是不行的呀,因为我是想把U盘上的GHO映像文件还原到硬盘上去,而不同的机子对U盘的识别不同,这样执行GHOST时的参数也就不一样,所以需要知道当前盘符
!
作者: logan0279
时间: 2007-12-22 19:15
7楼的方法着实不错,比我自己想的那个好多了!
作者: chishingchan
时间: 2007-12-22 22:50
Quote: |
Originally posted by logan0279 at 2007-12-22 07:09 PM:
不指定盘符是不行的呀,因为我是想把U盘上的GHO映像文件还原到硬盘上去,而不同的机子对U盘的识别不同,这样执行GHOST时的参数也就不一样,所以需要知道当前盘符
! |
|
照你这样说来是可以的呀!
恢复:
ghost.exe -clone,mode=prestore,src=part2.gho,dst=1:2 -sure -rb
作者: jiulong
时间: 2007-12-23 07:19
@echo off
@for /f "tokens=2" %%i in ('dir^|find "驱动器"') do echo 当前盘符为:%%i
pause
作者: qzwqzw
时间: 2007-12-23 13:59
获取U盘引导盘盘符的话
我用的是%comspec%变量
if "%comspec%"=="C:\COMMAND.COM" set sysdrive=C:
if "%comspec%"=="A:\COMMAND.COM" set sysdrive=A:
作者: lianjiang2004
时间: 2007-12-23 15:26
Quote: |
Originally posted by qzwqzw at 2007-12-23 13:59:
获取U盘引导盘盘符的话
我用的是%comspec%变量
[code]
if "%comspec%"=="C:\COMMAND.COM" set sysdrive=C:
if "%comspec%"=="A:\COMMAND.COM" se ... |
|
好办法,谢谢了。呵呵。
比特征文件好多了。
作者: Climbing
时间: 2007-12-23 21:19
Quote: |
Originally posted by qzwqzw at 2007-12-23 13:59:
获取U盘引导盘盘符的话
我用的是%comspec%变量
[code]
if "%comspec%"=="C:\COMMAND.COM" set sysdrive=C:
if "%comspec%"=="A:\COMMAND.COM" se ... |
|
这种方法是见仁见智的,因为有的启动盘会在启动时建立内存盘,并将command.com复制到内存盘上并修改comspec环境变量指向内存盘的command.com。所以,还是要具体情况具体分析。
作者: qzwqzw
时间: 2007-12-23 23:00
没错这种方法用途有限
config.sys的shell和autoexec.bat的set可能会把%comspec%改得五花八门
我一般也只用在自己的autoexec.bat中
而且通常放在建立内存盘之前
而获取的%sysdrive%也只能用在自己编写的应用批处理中
而为了兼容它人编写的批处理代码
我通常会在autoexec.bat中先检查A盘是否可读
如果不可读则subst a: c:\建立虚拟A盘
以兼容其它一些可能会读A盘的代码
作者: chenall
时间: 2007-12-23 23:48
我觉得还是通过U盘里面的一个特殊文件来判断比较保险.
因为其它方法,都有N种可能.而用特殊文件,就不会.
PS:好久没有看到willsort了.好崇拜willsort.批处理牛.汇编也牛.呵呵
[
Last edited by chenall on 2007-12-23 at 11:52 PM ]
作者: lianjiang2004
时间: 2007-12-24 07:37
Quote: |
Originally posted by Climbing at 2007-12-23 21:19:
这种方法是见仁见智的,因为有的启动盘会在启动时建立内存盘,并将command.com复制到内存盘上并修改comspec环境变量指向内存盘的command.com。所以,还是要具体情况具体分析。 |
|
自己制作的启动盘里使用时没问题的,只要在autoexec的开头就把此参数赋予一个变量即可。
作者: qzwqzw
时间: 2007-12-24 23:53
文件标记也具有局限性
USB-FDD模式有可能读不到这个标记文件
USB-CD模式则可能在读无盘的真实光驱时卡壳
USB-HDD和USB-ZIP则无法避免这个异常
在只有C盘或A盘时再去判断另外一个盘上的文件
可能会因为设备未准备好而出现异常
作者: lianjiang2004
时间: 2007-12-25 08:06
Quote: |
Originally posted by qzwqzw at 2007-12-24 23:53:
文件标记也具有局限性
USB-FDD模式有可能读不到这个标记文件
USB-CD模式则可能在读无盘的真实光驱时卡壳
USB-HDD和USB-ZIP则无法避免这个异常
在只有 ... |
|
采用特征文件方法的话,我采用的是只判断C:\有无此文件,没有的话,就认为不是usb-hdd方式启动的。硬盘号为1.
接下来准备在此基础上,加上第1硬盘是否只有一个分区的判断。
作者: chishingchan
时间: 2007-12-25 10:50
lianjiang2004 的文字表达不错,就是不给你结果,让你自己摸索、让你自己解决!
作者: logan0279
时间: 2007-12-26 10:22
Quote: |
Originally posted by chishingchan at 2007-12-22 10:50 PM:
照你这样说来是可以的呀!
恢复:
ghost.exe -clone,mode=prestore,src=part2.gho,dst=1:2 -sure -rb |
|
问题就在于dst这里,U盘在不同的机器上识别是不同的,有机器将其识别为硬盘,这样的话,就应是dst=2:1,而有的机器将其识别为软盘,这样就应是dst=1:1,所以需要知道当前盘符是A还是C,然后才能使用相应的参数的呀!
作者: logan0279
时间: 2007-12-26 10:30
哈哈,看到我的帖子引得这么多讨论,真是高兴啊!可惜我是个菜鸟,好多都看得云里雾里,以后得多多努力了!
作者: lianjiang2004
时间: 2007-12-26 14:16
Quote: |
Originally posted by chishingchan at 2007-12-25 10:50:
lianjiang2004 的文字表达不错,就是不给你结果,让你自己摸索、让你自己解决! |
|
包括你提出的问题,不是我不给结果,你的问题一开始我就给出了我用的代码,可惜答非所问。
从那些代码,你也能看出,我并不擅长批处理,无法像高手那样用短短几行解决问题,需要用最笨的办法来实现。
同时,在无法正确把握提问题意图的情况下,你说有必要费很长时间来些可能并非别人需要的具体解决方案吗?
就像你的问题,一直无法理解意图,如何操作?呵呵。
当然并不妨碍我根据自己的理解和经验,提出自己的看法供别人参考。
作者: terse
时间: 2007-12-26 15:16
我在AUTOEXEC.BAT里这样处理的:
CD>%TEMP%\DRV.TXT
strings ud=read %TEMP%\DRV.TXT,1
%ud%就是启动盘符
你可以IF一下 是A就SET DST=1:1 是C就SET DST=2:1
[
Last edited by terse on 2007-12-26 at 03:21 PM ]
作者: logan0279
时间: 2007-12-30 16:46
今天无事看下DOS之家的优盘启动盘,发现一个似乎更好的方法:
cd\
dir |find "drive C" && goto bootc
:boota
......
:bootc
......
不过这种方法只适用于从优盘直接启动到DOS,并且这段代码最好要在AUTOEXEC.BAT里面
[
Last edited by logan0279 on 2008-1-1 at 12:34 PM ]
作者: logan0279
时间: 2008-1-1 12:37
受达人 qzwqzw 的启法,结合FOR命令,还有一种方法也可以得知U盘启动盘盘符:
for /f "delims=:\ tokens=1" %%i in ('echo %comspec%') do set sysdrive=%%i:
这段码在CMD环境下测试通过,不晓得在纯DOS下可不可以!
作者: logan0279
时间: 2008-1-1 12:38
而获取当前盘符则可以用以下这段代码:
for /f "delims=:\ tokens=1" %%i in ('CD') do set subdrive=%%i:
作者: logan0279
时间: 2008-1-1 13:25
真郁闷死了,在纯DOS下居然不行!哎,可怜我的一腔激情啊!
作者: chishingchan
时间: 2008-1-1 16:26
不好意思,捣错了,以下是最后盘符的答案!
bdrv.exe 这个东西本坛应该可以找得到,nset.com 及 count.com 本坛不知找不找到,后两个是以前在某外国网站下载的(好像跟WBAT有关的网站)
特点:无需生成过渡文件
1、bdrv.exe 执行后生成几行的硬盘盘符
2、nset.com 将 1 生成的盘符赋值于变量
3、count.com 是个计算器,由 Z 盘的值(26)递减
@echo off
set num=26
:check
bdrv|nset lastpart=$%num%
count num -
if "%lastpart%"=="" goto check
echo %lastpart%
pause
:end
[
Last edited by chishingchan on 2008-1-1 at 04:28 PM ]
作者: lianjiang2004
时间: 2008-1-1 20:01
Quote: |
Originally posted by logan0279 at 2008-1-1 12:37:
受达人 qzwqzw 的启法,结合FOR命令,还有一种方法也可以得知U盘启动盘盘符:
for /f "delims=:\ tokens=1" %%i in ('echo %comspec%') do set sysdrive=%%i:
这段码 ... |
|
dos下有这么强大的字符处理能力那就无忧了。呵呵。
不行的。
作者: lianjiang2004
时间: 2008-1-1 20:02
Quote: |
Originally posted by logan0279 at 2007-12-30 16:46:
今天无事看下DOS之家的优盘启动盘,发现一个似乎更好的方法:
cd\
dir |find "drive C" && goto bootc
:boota
......
:bootc
......
不过这种方 ... |
|
这种处理方法也是可能出问题的。
u盘写保护时就死掉了。呵呵。
作者: lianjiang2004
时间: 2008-1-1 20:20
Quote: |
Originally posted by chishingchan at 2008-1-1 16:26:
不好意思,捣错了,以下是最后盘符的答案!
bdrv.exe 这个东西本坛应该可以找得到,nset.com 及 count.com 本坛不知找不找到,后两个是以前在某外国 ... |
|
不是要当前盘符吗?怎么搞成最后盘符了?呵呵。
另有一帖是要最后盘符的,不过是要CMD的方案。
作者: yunt
时间: 2008-2-25 14:14
Quote: |
Originally posted by lianjiang2004 at 2008-1-1 08:02 PM:
这种处理方法也是可能出问题的。
u盘写保护时就死掉了。呵呵。 |
|
这种方法我觉得是最简便的,如果根目录下文件不多的话:)
写保护可以通过set tmp到RAM解决。
作者: DOSforever
时间: 2008-2-27 04:20
大家讨论了那么长,可真够辛苦的。4DOS 的一个内部变量就解决问题了:
_disk Quote: |
_DISK returns the current disk drive letter, without a colon (for example, C). |
|
作者: downsky
时间: 2008-2-27 23:24
很多不错的好办法啊。。。。
作者: tuliangwl
时间: 2008-2-28 00:47
学习一下