无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 6145|回复: 28
打印 上一主题 下一主题

判断某一分区是fat32或是NTFS分区的批处理如何写

[复制链接]
跳转到指定楼层
1#
发表于 2012-2-10 15:31:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

我想在纯dos下,若不行就在windows的dos窗口下,用批处理来判断某一分区是fat32或是NTFS分区,该批处理该如何写,请各位网友指点,谢谢!

此问题,经各位网友的热心指点,已初步解决,在此表示非常感谢!



[ 本帖最后由 qj_tzy 于 2012-2-15 19:21 编辑 ]
2#
发表于 2012-2-10 16:58:16 | 只看该作者
纯dos下不知道,貌似不加载NTFS驱动是认不到的吧。。。

CMD窗口下试试这样(假设要识别C:)
  1. @echo off
  2. for /f "tokens=1-2 delims==" %%a in ('wmic logicaldisk where name^="c:" get filesystem /value ^|findstr /i "filesystem"') do echo 文件系统是 %%b
  3. pause
复制代码

也可以试试这样:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1-2 delims= " %%a in ('chkntfs c: ^|findstr "文件系统"') do set var=%%b&echo 文件系统是 !var:。=!
  3. pause
复制代码

不好意思,第2个忘去后面的句话了,修改下。

[ 本帖最后由 pznpt 于 2012-2-10 18:23 编辑 ]
回复

使用道具 举报

3#
 楼主| 发表于 2012-2-10 17:33:24 | 只看该作者

回复 #2 pznpt 的帖子

在windows的dos窗口下,执行以上批处理,确实能识别出某一分区是fat32或ntfs格式。

但完全没看懂该处理是如何实现的,能请你说明一下吗
回复

使用道具 举报

4#
发表于 2012-2-10 18:08:27 | 只看该作者
这个,还真是不好描述呢。。。

以第2个为例,chkntfs c: 得到的结果是两行:

chkntfs c: |findstr "文件系统" 就是找出上面结果中包含有"文件系统"字串的行,即第一行:文件系统的类型是 NTFS

然后把"文件系统的类型是 NTFS"这一行字串赋值给变量,再用FOR循环读取。

"tokens=1-2 delims= "的意思是:以空格做为分割符,分为1和2两个单元,1为"文件系统的类型是"; 2为"NTFS"。

我们要读取的变量就是第2个: NTFS

不知道我说明白了没有,你可以看看FOF /?帮助。
回复

使用道具 举报

5#
发表于 2012-2-10 18:57:27 | 只看该作者
1。CMD窗口输入:
wmic logicaldisk where "drivetype=3" get name,filesystem
一句话搞定。


2.在纯dos下,需要第三方软件,比如gdisk.

[ 本帖最后由 dos时代菜鸟 于 2012-2-10 19:12 编辑 ]
回复

使用道具 举报

6#
 楼主| 发表于 2012-2-10 20:12:12 | 只看该作者

回复 #pznpt 、#5 dos时代菜鸟 的帖子

特别感谢两位的热心指点,解决了我的问题。

说实话,我确实没看懂。

好象有个关于wmic的帖子,我没留意。

也许我要把这个帖子看懂了,才能看懂两位的回复吧

若看不懂,再向两位请教。再次真心感谢!
回复

使用道具 举报

7#
 楼主| 发表于 2012-2-10 22:33:57 | 只看该作者

回复 #2 pznpt 的帖子

请问以下两句是何意,能请您解释一下吗:
1、 !var:。=!
2、@echo off&setlocal enabledelayedexpansion
回复

使用道具 举报

8#
发表于 2012-2-10 23:13:41 | 只看该作者
1. 因为设置变量var的值是"NTFS。"(注意后面有句点), !var:。=!作用就是删去句点,代表的值就是NTFS了,具体你可以看set /?

2. 关闭回显并启用变量延迟扩展,请以“变量延迟”百度一下。

批处理我也是刚学,小白一个,知道的并不多呢,呵呵。。。
回复

使用道具 举报

9#
发表于 2012-2-11 13:45:27 | 只看该作者
baidu 搜索 wmic 就知道是怎么回事了,wmic 非常简单。

你不妨照着 我说的命令,在 cmd 下运行一次,就知道了。都是标准的英文单词,人类语言。呵呵。

[ 本帖最后由 dos时代菜鸟 于 2012-2-11 13:46 编辑 ]
回复

使用道具 举报

10#
发表于 2012-2-11 19:42:02 | 只看该作者
有一个巧妙的方法,ntfs根目录存在着看一些不见的元文件(比如$mft),而FAT32没有。

在ntfs中md $mft会提示$mft已经存在无法建立,而FAT32中则可以正常md 和rd $mft

这样可以完全依靠cmd或者dos(dos下已加载ntfs驱动)的内部命令来确认ntfs和FAT,不过就是不能区分FAT16和FAT32

[ 本帖最后由 fujianabc 于 2012-2-11 19:45 编辑 ]
回复

使用道具 举报

11#
 楼主| 发表于 2012-2-11 23:18:13 | 只看该作者

回复 #10 fujianabc 的帖子

我按你的指点,编了下段批处理,执行后显示格式为FAT32,但c:盘的格式为NTFS,烦请指点一下,谢谢!
@echo off
set drv=c:
set partype=fat32
if exist %drv%/$mft/nul set partype=ntfs
echo %drv%盘的分区格式为:%partype%
pause
回复

使用道具 举报

12#
发表于 2012-2-11 23:26:07 | 只看该作者
原帖由 qj_tzy 于 2012-2-11 23:18 发表
我按你的指点,编了下段批处理,执行后显示格式为FAT32,但c:盘的格式为NTFS,烦请指点一下,谢谢!
@echo off
set drv=c:
set partype=fat32
if exist %drv%/$mft/nul set partype=ntfs
echo %drv%盘的分 ...

if exist 判断不到$mbr文件的存在的,必须要用md是否成功来判断,以下是我那个nt 6.x安装器中ntfs判断的代码。如果能够成功建立$mbr文件夹,该分区就不是ntfs,然后删除掉刚建立的$mbr文件夹
  1. REM --------------------------------------------------------------------------------------
  2. REM 判断是否是NTFS
  3. REM --------------------------------------------------------------------------------------
  4. md %installpath%\$mft >NUL
  5. if not errorlevel 1 (
  6. rd %installpath%\$mft >NUL
  7. echo.
  8. echo    %installpath%分区不是NTFS
  9. echo.
  10. )
复制代码

[ 本帖最后由 fujianabc 于 2012-2-11 23:32 编辑 ]
回复

使用道具 举报

13#
 楼主| 发表于 2012-2-12 09:23:48 | 只看该作者

回复 #12 fujianabc 的帖子

我按你的指点,改为下段批处理,测试成功,谢谢!
@echo off
set drv=c:
set partype=ntfs

md %drv%\$mft >NUL
if not errorlevel 1 (
rd %drv%\$mft >NUL
set partype=fat32
)

echo %drv%盘的分区格式为:%partype%
pause
回复

使用道具 举报

14#
 楼主| 发表于 2012-2-12 21:38:20 | 只看该作者

回复 #2 pznpt 的帖子

还烦请指点:

对例子1,查了wmic,觉得很复杂,看一看资料再向你请教,先向你请教例子2的问题:
1、对!var:。=!,是否可这样理解:在未启用变量延迟前,本该用%var:str2=str1%,即用str1代替str2的内容,若str1为空,相当于去除str2的内容。启用变量延迟后,两个 %  %就该用两个!  !来代替了,就变成了!var:str2=str1! ,此处即为!var:。=!,因str1的内容为空,就相当于删除str2中的内容“。”号了。

2、chkntfs c: ^|findstr "文件系统",我先以为其中的"^"可能是多余的,删除之,该句变为chkntfs c: |findstr "文件系统"后,却得不到正确结果,不知"^"是何作用。

3、for中变量是 %%a,为何set var=%%b, 难道中间结果却是%%b ,是否%%a的结果是:“文件系统的类型是”。
回复

使用道具 举报

15#
发表于 2012-2-13 00:39:45 | 只看该作者

回复 #14 qj_tzy 的帖子

1、是这样子的。

2、^符号为转义符。因为“|”本身是特殊符号,CMD执行FOR循环之前需要进行预处理,将“|”解析成普通符号(要将特殊符号转换成普通符号,必须用转义符),接着交给FOR循环自身去处理。关于CMD的预处理机制,说实话,我也稀里糊涂。。。

3、FOR命令中如果使用了tokens,那么被分割的每个单元依次是%%a,%%b,%%c等,结合这个实例,%%b代表的是"NTFS。",即第二个单元。

不知我表达清楚没有。其实你可以输入FOR/?看看的。它说的比我清楚百倍,呵呵。。。
回复

使用道具 举报

16#
 楼主| 发表于 2012-2-13 10:25:10 | 只看该作者

回复 #15 pznpt 的帖子

对例子2,已基本清楚了,谢谢您的指点。

再向您请教#2楼例子1中的两个问题:
1、get filesystem /value 中的/value参数,不知是何作用。
2、^|findstr /i 中的/i 参数,是何作用。

谢谢!
回复

使用道具 举报

17#
发表于 2012-2-13 17:04:25 | 只看该作者
小结了以上几种方法,提供如下批处理(含5种方法)

纠正一下,批处理中的解释语句只有第一个中才是正确的,后边的是直接在1上边修改的,忘记了删除,幸好不误事,汗

另外想到一个:

@echo off
chkntfs %~d0 |findstr /I "ntfs">NUL&&(echo %~d0文件系统是NTFS&set filesys=n)
chkntfs %~d0 |findstr /i "FAT">NUL&&(echo %~d0文件系统是FAT&set filesys=f)
chkntfs %~d0 |findstr /i "FAT16">NUL&&(echo %~d0文件系统是FAT16&set filesys=f16)
chkntfs %~d0 |findstr /i "FAT32">NUL&&(echo %~d0文件系统是FAT32&set filesys=f32)
echo 文件系统代码为:%filesys%
pause>nul

如果要判断是不是某种分区格式,只需要取对应的语句就OK

[ 本帖最后由 kloikjj 于 2012-2-14 19:44 编辑 ]

检验分区是否NTFS.zip

2.64 KB, 下载次数: 39, 下载积分: 无忧币 -2

回复

使用道具 举报

18#
发表于 2012-2-13 18:25:38 | 只看该作者
原帖由 qj_tzy 于 2012-2-13 10:25 发表
对例子2,已基本清楚了,谢谢您的指点。

再向您请教#2楼例子1中的两个问题:
1、get filesystem /value 中的/value参数,不知是何作用。
2、^|findstr /i 中的/i 参数,是何作用。

谢谢!


1、这里的value参数控制显示输出格式。看看下面的图就知道了:


2、findstr 的/i 参数指查找的字符串不分大小写,如字符串"abcd"与"ABCD"是一样的。
回复

使用道具 举报

19#
 楼主| 发表于 2012-2-14 09:16:40 | 只看该作者

回复 #17 kloikjj 的帖子

感谢您提供的批处理,我好好学习一下,不清楚时再向您请教!
回复

使用道具 举报

20#
 楼主| 发表于 2012-2-14 09:25:51 | 只看该作者

回复 #5 dos时代菜鸟 的帖子

我将您在#5楼的批命令改了一下,想求得某盘的分区格式:

@echo off
set drv=c:
for /f "tokens=1-2 delims= " %%a in ('wmic logicaldisk where "drivetype=3" get name,filesystem ^|findstr /i  %drv%') do set partype=%%b
echo 文件系统是 %partype%
pause>nul

但运行出错,提示“无效的get表达式”,请您及pznpt 等各位网友指教!
回复

使用道具 举报

21#
 楼主| 发表于 2012-2-14 09:45:24 | 只看该作者

回复 #17 kloikjj 的帖子

请教:
您在批处理1中的这句,不明其意:
md %~d0\$mft>nul 2>nul

%~d0
2>nul

均不明其意

[ 本帖最后由 qj_tzy 于 2012-2-14 11:46 编辑 ]
回复

使用道具 举报

22#
发表于 2012-2-14 16:33:09 | 只看该作者
%~d0 :

%0,指批处理自身,中间加了~d,表示引用批处理自身所在的盘符,P处理放在某盘,这个符号就代表某盘,如放在C盘(或C盘子路径下),%~d0就代表c:,这样就不用去指明要查哪个盘符的文件系统了

>nul 2>nul:

为了屏蔽屏幕回显,因为如果是NT分区,建立文件夹的过程会提示一句错误语句,看着烦,就把它屏蔽了
回复

使用道具 举报

23#
发表于 2012-2-14 19:57:23 | 只看该作者
原帖由 qj_tzy 于 2012-2-14 09:25 发表
我将您在#5楼的批命令改了一下,想求得某盘的分区格式:
@echo off
set drv=c:
for /f "tokens=1-2 delims= " %%a in ('wmic logicaldisk where "drivetype=3" get name,filesystem ^|findstr /i  %drv%') do set partype=%%b
echo 文件系统是 %partype%
pause>nul


把括号里的内容:

'wmic logicaldisk where drivetype^="3" get name^,filesystem ^|findstr /i  %drv%'
回复

使用道具 举报

24#
 楼主| 发表于 2012-2-15 11:04:13 | 只看该作者

回复 #23 pznpt 的帖子

按您在#23楼的指点,我按此更改,已测试成功,谢谢!

再请教您两个问题:
1、md %~d0\$mft>nul 2>nul 这句,我知是屏蔽屏幕回显,但只用md %~d0\$mft>nul 仍有屏幕回显,加上2>nul 后,屏幕回显就没有了,不知为何?

2、您在例子5中的这句不明其意:
for /f "delims=" %%i in ('dir /a-d /b %windir%\2.txt') do (
    for %%j in (%windir%\2.txt) do set dx=%%~zj

特别是:~zj,更不明其意。
回复

使用道具 举报

25#
发表于 2012-2-15 13:24:44 | 只看该作者

回复 #24 qj_tzy 的帖子

1、1>nul关闭命令执行正确后的回显;2>nul关闭命令执行失败后的回显。1>nul 2>nul合起来用就是关闭所有回显。

2、你记错了,这不是我的例子,这是FOR循环嵌套。关于变量的扩展,请看for/?,当然可以参考http://bbs.wuyou.net/forum.php?m ... &extra=page%3D4
回复

使用道具 举报

26#
 楼主| 发表于 2012-2-15 14:47:34 | 只看该作者

回复 #25 pznpt 的帖子

谢谢指点,我要仔细学习你推荐的帖子的内容,不懂的再向你请教!
回复

使用道具 举报

27#
 楼主| 发表于 2012-2-15 14:48:52 | 只看该作者

回复 #17 kloikjj 的帖子

您在例子5中的这句不明其意,希望能指点一下:
for /f "delims=" %%i in ('dir /a-d /b %windir%\2.txt') do (
    for %%j in (%windir%\2.txt) do set dx=%%~zj

特别是:~zj,更不明其意。
回复

使用道具 举报

28#
发表于 2012-2-15 16:30:20 | 只看该作者
按照楼25中提供的网址里,有这个说明呀

%%~zj就是对变量%%j的大小进行识别  %%~zj就是表示%%j 的大小的
回复

使用道具 举报

29#
 楼主| 发表于 2012-2-15 16:55:25 | 只看该作者

回复 #28 kloikjj 的帖子

看了#25楼贴子中的一文《for命令中的变量扩展简单说明》,已明白其意了。

谢谢您及以上各位网友的指点!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-16 19:49

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表