中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-16 10:13
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已解决]如何正确的获得纯DOS下的最后分区盘符? 查看 7,167 回复 65
31 发表于 2007-12-23 08:09 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,282
发帖 538
注册 2002-11-02 00:00
UID 129
性别 男
状态 离线
系统盘为: D:, 分区号为: 3, 镜像占用约为: 454 MB.
备份盘为: H: (DOS:H:), 分区号为: 6, 剩余空间约为: 1284 MB.

分区号为:3 这个应该是2吧!我的硬盘分区没有NTFS格式的,不知如何测试?且我不需要这么多的结果,只需知道最后盘符就行。
32 发表于 2007-12-23 08:30 ·  中国 安徽 马鞍山 电信
金牌会员
★★★★
积分 3,946
发帖 1,884
注册 2006-01-20 13:00
UID 49283
性别 男
状态 离线
仅是个人的一点经验,仅供参考。

[ Last edited by lianjiang2004 on 2007-12-24 at 08:01 AM ]
Windows 一键还原
http://www.yjhy.com
33 发表于 2007-12-23 09:02 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,282
发帖 538
注册 2002-11-02 00:00
UID 129
性别 男
状态 离线
有进展了,qzwqzw 的例子修改如下:

@echo off
setlocal EnableDelayedExpansion
for /f "tokens=1" %%i in ('wmic logicaldisk where "drivetype=3" get FileSystem') do (
set filesystem=%%i
if "!filesystem:~0,3!"=="FAT" set /a id+=1
)
echo %id%
set Drive=CDEFGHIJKLMNOPQRSTUVWXYZ
set lastdrive=!Drive:~%id%,1!:
echo %lastdrive%
pause


返回值与目标不符!
返回值 ID=6
目标盘符 =I: (这里应该是H:才对)
34 发表于 2007-12-23 09:06 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,282
发帖 538
注册 2002-11-02 00:00
UID 129
性别 男
状态 离线
现在唯有将
set Drive=CDEFGHIJKLMNOPQRSTUVWXYZ
修改为(=号后加空格)
set Drive= CDEFGHIJKLMNOPQRSTUVWXYZ
这样才对。

谁能帮忙解答为什么会出现这种情况?
谁能再为上面的代码精简一下?
35 发表于 2007-12-23 13:46 ·  中国 江西 南昌 电信
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
UID 19350
性别 男
状态 离线

@echo off & setlocal EnableDelayedExpansion
set drives= CDEFGHIJKLMNOPQRSTUVWXYZ
for /f %%i in ('wmic logicaldisk get FileSystem ^| find /c "FAT"') do set lastdrive=!drives:~%%i,1!
echo 在纯DOS下最后一个可识别的硬盘分区的盘符为:%lastdrive%


这是专为你的应用精简的代码
但是我感觉这个方案如果用于系统备份分区的选择考虑很不周全

不知你是否考虑过分区的剩余空间是否满足要求
以及USB-HDD引导后盘符发生移位的可能

至于我的上一段代码的问题可能源于你的WMIC的输出比较特殊
如果有兴趣的话可以单独将WMIC的输出结果贴上来看看

你的修改代码返回值不符的问题在于你没有完全理解 set 的取子串规则
set 取字串的下标是从0算起的
也就是说~0代表第一个字符,~1代表第二个字符

[ Last edited by qzwqzw on 2007-12-23 at 01:55 PM ]
36 发表于 2007-12-23 15:38 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,282
发帖 538
注册 2002-11-02 00:00
UID 129
性别 男
状态 离线
谢谢!算作解决了。
37 发表于 2007-12-23 16:14 ·  中国 安徽 马鞍山 电信
金牌会员
★★★★
积分 3,946
发帖 1,884
注册 2006-01-20 13:00
UID 49283
性别 男
状态 离线
通用性很怀疑。呵呵。
Windows 一键还原
http://www.yjhy.com
38 发表于 2007-12-23 16:33 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,282
发帖 538
注册 2002-11-02 00:00
UID 129
性别 男
状态 离线
Originally posted by lianjiang2004 at 2007-12-23 04:14 PM:
通用性很怀疑。呵呵。


你的技术也值得怀疑啊!:D 说了这么多对我的问题一点也帮不上忙。

说笑!别见怪!
39 发表于 2007-12-23 16:36 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,282
发帖 538
注册 2002-11-02 00:00
UID 129
性别 男
状态 离线
正所谓一样通百样明,不完善的地方我会慢慢地去处理的。
qzwqzw 对此帮忙功不可没,衷心感谢。犹其是30楼的代码,以后还有参考的地方。
40 选择优化方案 发表于 2007-12-23 16:52 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,282
发帖 538
注册 2002-11-02 00:00
UID 129
性别 男
状态 离线
以下是 35 楼发贴我想的精简方案:

@echo off
setlocal EnableDelayedexpansion
for /f "tokens=1" %%i in ('wmic logicaldisk where "drivetype=3" get FileSystem ^|findstr "FAT"') do set /a id+=1
set Drive= CDEFGHIJKLMNOPQRSTUVWXYZ
set lastdrive=!Drive:~%id%,1!:
echo %lastdrive%
pause>nul


以下是 35 楼的精简方案:

@echo off & setlocal EnableDelayedExpansion
set drives= CDEFGHIJKLMNOPQRSTUVWXYZ
for /f %%i in ('wmic logicaldisk get FileSystem ^| find /c "FAT"') do set lastdrive=!drives:~%%i,1!
echo 在纯DOS下最后一个可识别的硬盘分区的盘符为:%lastdrive%


虽然我的精简方案比较长,35 楼的方案精简,运行后大家估计会如何?

1、我的显示速度快,35 楼的比较慢;
2、我的运行很安静,35 楼的会响一声(读软驱)。
41 发表于 2007-12-23 16:59 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,282
发帖 538
注册 2002-11-02 00:00
UID 129
性别 男
状态 离线
最后总结

@echo off
setlocal EnableDelayedExpansion
set drives= CDEFGHIJKLMNOPQRSTUVWXYZ
for /f %%i in ('wmic logicaldisk where "drivetype=3" get FileSystem ^| find /c "FAT"') do set lastdrive=!drives:~%%i,1!:
echo %lastdrive%
pause>nul
42 发表于 2007-12-23 20:43 ·  中国 安徽 马鞍山 电信
金牌会员
★★★★
积分 3,946
发帖 1,884
注册 2006-01-20 13:00
UID 49283
性别 男
状态 离线
这里高手如云,关于你要的windows下获取盘符的办法,我就没有发言的资格了。
不过,我想,在前面几楼里,指出的需要注意的几个问题,难道对你没益处吗?

[ Last edited by lianjiang2004 on 2007-12-24 at 08:00 AM ]
Windows 一键还原
http://www.yjhy.com
43 发表于 2007-12-23 21:13 ·  中国 河北 保定 移动
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
UID 1565
性别 男
来自 河北保定
状态 离线
是啊,这种方案只能针对一个硬盘主分区的情况,如果有多个主分区,就完全不适用,还是ghost的1:x指定分区的方式比较稳定可靠。gghost好象就使用了这种方案。
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
44 发表于 2007-12-23 21:30 ·  中国 安徽 马鞍山 电信
金牌会员
★★★★
积分 3,946
发帖 1,884
注册 2006-01-20 13:00
UID 49283
性别 男
状态 离线
限于水平,很遗憾没能直接帮上你的忙,希望指出的一些其它问题,也能引起你的足够重视。

[ Last edited by lianjiang2004 on 2007-12-24 at 07:59 AM ]
Windows 一键还原
http://www.yjhy.com
45 发表于 2007-12-24 10:05 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,282
发帖 538
注册 2002-11-02 00:00
UID 129
性别 男
状态 离线
在这里隆重的热烈的谢谢 lianjiang2004
确实获益非浅。

复43楼:这个是我帮人家装机时用的,一般处理如下:
1、在需要重装的电脑上备份驱动到U盘
2、带DOS启动的XPSP2安装盘一张:分区(SPFDISK.EXE)、传送DOS系统(SYS.COM)、光盘方式安装XPSP2(自制精简版)
3、第二次启动时备份一次(无驱动备份)
4、安装驱动
5、运行自制程序:服务优化、文件夹转移、影子系统、恢复软件、DOS文件
6、再次备份一次系统(带驱动备份)
7、安装常用软件
8、最后再备份一次系统
注:因使用精简版,所以精简的系统也就 2?? MB
最后备份的一般也超不过 1 G

各位看上面就知道,本人全程监控的,还需检测容量、分区错乱等等的必要吗?
论坛跳转: