无忧启动论坛

标题: 求助,下面这个批处理怎么改? [打印本页]

作者: 807979023    时间: 2020-7-15 21:38
标题: 求助,下面这个批处理怎么改?
求助,下面这个批处理怎么改?

1. 盘符,卷名,文件系统名,显示在同1行。
2. 不显示标题 "卷名,文件系统名" 效果如下:

c: os NTFS
d: 程序 FAT32
e: bak NTFS
...
  1. @echo off&color 1f
  2. for %%a 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 (
  3.   if exist %%a: (
  4.      echo %%a:
  5.      fsutil fsinfo volumeinfo %%a:\|find "卷名"
  6.      fsutil fsinfo volumeinfo %%a:\|find "文件系统名"
  7.   )
  8. )
  9. echo.&echo 按任意键退出...&pause >nul
复制代码




作者: plusv    时间: 2020-7-15 23:10
@echo off&color 1f&setlocal EnableDelayedExpansion
for %%a 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 (
  if exist %%a: (
     FOR /F "tokens=3 delims= " %%i in ('fsutil fsinfo volumeinfo %%a:\^|find "磁碟區名"') do set MyVol=%%i
     FOR /F "tokens=3 delims= " %%i in ('fsutil fsinfo volumeinfo %%a:\^|find "檔案系統名"') do set MyFS=%%i
     echo %%a: !MyVol! !MyFS!
  )
)
echo.&echo 按任意鍵結束...&pause >nul




作者: 807979023    时间: 2020-7-16 10:31
谢谢指点,在win10和win7中运行成功,在xp中显示不正常。

win7.jpg (38.01 KB, 下载次数: 147)

win7.jpg

winxp.jpg (39.23 KB, 下载次数: 140)

winxp.jpg

作者: foxfirefox    时间: 2020-7-16 13:04
xp下改为:
@echo off&color 1f&setlocal EnableDelayedExpansion
for %%a 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 (
  if exist %%a: (
    FOR /F "tokens=3 delims= " %%i in ('fsutil fsinfo volumeinfo %%a:\^|find "卷名"') do set MyVol=%%i
    FOR /F "tokens=3 delims= " %%i in ('fsutil fsinfo volumeinfo %%a:\^|find "文件系统名"') do set MyFS=%%i
    echo.          !MyVol! %%a: !MyFS!
  )
)
echo.&echo 按任意鍵結束...&pause >nul
作者: plusv    时间: 2020-7-17 02:53
807979023 发表于 2020-7-16 10:31
谢谢指点,在win10和win7中运行成功,在xp中显示不正常。

虽然 4F foxfirefox 大牛给出了修改,
但我还是不解,
同样的批处理,
理论上应会得到相同的结果.

好奇心研究了一下原因为何 ?
发现了是 MS 真是太牛逼了,
在 Windows XP 会多显示一个 0xD 字符,
而 0xD 字符可是 RETURN,
导致发生奇怪的结果,
MS 你累了吗 ?

所以改法就是,
把它的结果去掉一个字符.
set MyVol=!MyVol:~0,-1!

@echo off&color 1f&setlocal EnableDelayedExpansion
for %%a 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 (
  if exist %%a: (
     FOR /F "tokens=3 delims= " %%i in ('fsutil fsinfo volumeinfo %%a:\^|find "磁碟区名"') do set MyVol=%%i&set MyVol=!MyVol:~0,-1!
     FOR /F "tokens=3 delims= " %%i in ('fsutil fsinfo volumeinfo %%a:\^|find "档案系统名"') do set MyFS=%%i&set MyFS=!MyFS:~0,-1!
     echo %%a: !MyVol! !MyFS!
  )
)
echo.&echo 按任意键结束...&pause >nul




作者: 807979023    时间: 2020-7-17 11:30
plusv 发表于 2020-7-17 02:53
虽然 4F foxfirefox 大牛给出了修改,
但我还是不解,
同样的批处理,

学习知识了!去掉一个字符后win7显示又不正常了。
为了少点代码,改成以下内容。

@echo off&color 1f&setlocal EnableDelayedExpansion
for /f "tokens=1* delims=[" %%a in ('ver') do set b=%%b
set b=%b:* =%
set b=%b:~0,3%
set c=%b:~0,2%
for %%a 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 (
  if exist %%a: (
    FOR /F "tokens=3 delims= " %%i in ('fsutil fsinfo volumeinfo %%a:\^|find "卷名"') do set MyVol=%%i
    FOR /F "tokens=3 delims= " %%i in ('fsutil fsinfo volumeinfo %%a:\^|find "文件系统名"') do set MyFS=%%i
    if "%c%" == "5." (
      echo.          !MyFS! %%a: !MyVol!
    ) else (
      echo %%a: !MyVol! !MyFS!
    )
  )
)
echo.&echo 按任意键退出...&pause >nul



作者: foxfirefox    时间: 2020-7-17 11:48
本帖最后由 foxfirefox 于 2020-7-17 11:49 编辑

请将 %%a:\ 后面的\删除 (WIN10 X64 测试)
@echo off&color 1f&setlocal EnableDelayedExpansion
for /f "tokens=1* delims=[" %%a in ('ver') do set b=%%b
set b=%b:* =%
set b=%b:~0,3%
set c=%b:~0,2%
for %%a 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 (
  if exist %%a: (
    FOR /F "tokens=3 delims= " %%i in ('fsutil fsinfo volumeinfo %%a:^|find "卷名"') do set MyVol=%%i
    FOR /F "tokens=3 delims= " %%i in ('fsutil fsinfo volumeinfo %%a:^|find "文件系统名"') do set MyFS=%%i
    if "%c%" == "5." (
      echo.          !MyFS! %%a: !MyVol!
    ) else (
      echo %%a: !MyVol! !MyFS!
    )
  )
)
echo.&echo 按任意键退出...&pause >nul
作者: 807979023    时间: 2020-7-17 12:43
本帖最后由 807979023 于 2020-7-18 14:04 编辑
foxfirefox 发表于 2020-7-17 11:48
请将 %%a:\ 后面的\删除 (WIN10 X64 测试)
@echo off&color 1f&setlocal EnableDelayedExpansion
for /f ...

谢谢,已去掉%%a:\ 后面的\
xp  win7x32  win10x64 都显示正常。

补充: 还是加上了%%a:后面的\ ,  xp  win7x32  win10x64 都显示正常。
如果去掉这个\ ,xp中,本批处理所在分区卷标显示不正常。

作者: dos时代菜鸟    时间: 2020-7-17 16:23
本帖最后由 dos时代菜鸟 于 2020-7-17 16:32 编辑

三个 for 循环 外加两个 if  可否搞定?
不用 find 也不用 设置  C d e f g 。。。。 矩阵式排查。也不用 判断 系统版本。
只在 win10 下测试了。算是 能用吧。



  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /f "tokens=1*" %%c in ('fsutil fsinfo drives') do (
  4.         for %%e in (%%d) do (
  5.                 set drv_info=%%~de
  6.                 for /f "tokens=1,2 delims=: " %%f in ('fsutil fsinfo volumeinfo %%~de') do (
  7.                         if %%f==卷名 (set drv_info=!drv_info! %%g)
  8.                         if %%f==文件系统名 (set drv_info=!drv_info! %%g)
  9.                 )
  10.                 echo !drv_info!
  11.         )
  12. )
  13. pause
复制代码

作者: 807979023    时间: 2020-7-17 19:22
dos时代菜鸟 发表于 2020-7-17 16:23
三个 for 循环 外加两个 if  可否搞定?
不用 find 也不用 设置  C d e f g 。。。。 矩阵式排查。也不用 ...

谢谢,代码很简洁,10和7显示正常,xp不行。
作者: dos时代菜鸟    时间: 2020-7-17 22:45
807979023 发表于 2020-7-17 19:22
谢谢,代码很简洁,10和7显示正常,xp不行。

没有 xp 环境,不知差哪
作者: nttwqz    时间: 2020-7-17 22:59
我也来凑个热闹

  1. @echo off

  2. for /f "tokens=1* " %%a in ('fsutil fsinfo drives') do (
  3.     for %%c in (%%b) do (
  4.         for /f "tokens=1,2 delims=: " %%d in ('fsutil fsinfo volumeinfo %%~dc') do if "%%d"=="文件系统名" (
  5.             for /f "tokens=1,3*" %%f in ('vol %%~dc') do if "%%f"=="驱动器" echo;%%~dc %%e  %%h
  6.         )
  7.     )
  8. )
  9. echo;------------------------------------------------
  10. setlocal enabledelayedexpansion
  11. for %%a 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 (
  12.     cd %%a:>nul 2>&1
  13.     if !errorlevel!==0 for /f "tokens=1,2 delims=: " %%b in ('fsutil fsinfo volumeinfo %%a:') do if "%%b"=="文件系统名" (
  14.             for /f "tokens=1,3*" %%d in ('vol %%a:') do if "%%d"=="驱动器" echo;%%a: %%c  %%f
  15.         )
  16.     )
  17. )
  18. echo;------------------------------------------------
  19. wmic volume get driveletter,filesystem,label|find ":"
  20. pause
复制代码


还是WMIC来的简单,一句!
作者: nttwqz    时间: 2020-7-17 23:00
仅测试Win8.1,XP这种古董没有。
作者: dos时代菜鸟    时间: 2020-7-18 09:51
对于 输出行结尾 带回车字符的情况,用 for/f  +echo字符串,的方式二次获取之,估计能解决。
作者: 807979023    时间: 2020-7-18 14:07
dos时代菜鸟 发表于 2020-7-18 09:51
对于 输出行结尾 带回车字符的情况,用 for/f  +echo字符串,的方式二次获取之,估计能解决。

xp下运行结果

xp.jpg (34.69 KB, 下载次数: 132)

xp.jpg

作者: 807979023    时间: 2020-7-18 14:09
nttwqz 发表于 2020-7-17 22:59
我也来凑个热闹

谢谢回复
方法1  7x32 10x64 显示正常,xp 显示错误。
方法2  7x32 10x64 显示正常,xp 显示错误。
方法3  7x32 显示正常,xp 10x64 显示错误。



作者: dos时代菜鸟    时间: 2020-7-18 17:40
  1.     @echo off
  2.     setlocal ENABLEDELAYEDEXPANSION
  3.     for %%e 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 (
  4.     if exist %%e: (
  5.             SET DRV_INFO=
  6.             for /f "tokens=1,2 delims=: " %%f in ('fsutil fsinfo volumeinfo %%e:\') do (
  7.                   if %%f==卷名 ( for /f  %%h in ('echo %%g') do ( set drv_info=%%e: !drv_info! %%h))
  8.                   if %%f==文件系统名 (for /f  %%h in ('echo %%g') do (ECHO !drv_info! %%h))
  9.             )
  10.     )
  11.     )
  12.     pause
复制代码
就这几句话,xp win10 都通过了




作者: nttwqz    时间: 2020-7-18 18:02
本帖最后由 nttwqz 于 2020-7-18 18:03 编辑
807979023 发表于 2020-7-18 14:09
谢谢回复
方法1  7x32 10x64 显示正常,xp 显示错误。
方法2  7x32 10x64 显示正常,xp 显示错误。

无论那种方法,在Win10x64上面都正常。


又回想起来,最初Victor888编写的盘符整理为何要自带一个fsutil.exe了,因为这个程序有太多的坑!
xp上fsutil fsinfo volumeinfo C:\结果和Win7以后系统不同虽然看似一样,到了10这句命令又错了,又不支持最后的\了,而Win8.1带不带都正常,XP不带不正常,这该让人说什么好,个人认为XP的错了,\不该有,还是Win8.1好,都兼容,也没有那么积极的推广PowerShell,右键默认CMD不像10还要改注册表,不想学PS。

下面代码在XP、Win8.1x64、Win10x64上测试通过。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=2 delims=[" %%Q in ('ver') do for /f "tokens=2,3 delims=. " %%R in ("%%Q") do set ver=%%R%%S
  4. if %ver%==51 set "fix=\"
  5. for %%a 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 (
  6.     cd %%a:>nul 2>&1
  7.     if !errorlevel!==0 (
  8.         for /f "tokens=1,2*" %%d in ('fsutil fsinfo volumeinfo %%a:%fix%') do (
  9.             for /f "tokens=1,2*" %%i in ("%%d %%f") do (
  10.                 if "%%i"=="文件系统名" set "vara=%%j"
  11.                 if "%%i"=="卷名" set "varb=%%j"
  12.             )
  13.         )
  14.         echo %%a: !vara!   !varb!
  15.     )
  16. )
  17. echo;------------------------------------------------
  18. echo list vol|diskpart|findstr /i "卷 ---"
  19. pause
复制代码


XP上个人测试前面一堆代码还没有最后一句echo list vol|diskpart|findstr /i "卷 ---"执行速度快
作者: nttwqz    时间: 2020-7-18 18:17
dos时代菜鸟 发表于 2020-7-18 17:40
就这几句话,xp win10 都通过了

然而,我测试的是你这XP、Win10都不行

fsutil的坑太多,我们还是建议楼主用坑少一点的diskpart吧,哈哈哈哈~


作者: dos时代菜鸟    时间: 2020-7-18 18:42
nttwqz 发表于 2020-7-18 18:17
然而,我测试的是你这XP、Win10都不行

fsutil的坑太多,我们还是建议楼主用坑少一点的diskpa ...

可能是 有的卷 没有卷标 导致的,
作者: dos时代菜鸟    时间: 2020-7-18 18:48
本帖最后由 dos时代菜鸟 于 2020-7-18 20:37 编辑
  1.     @echo off
  2.     setlocal ENABLEDELAYEDEXPANSION
  3.     for %%e 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 (
  4.     if exist %%e: (
  5.              SET DRV_INFO=
  6.                      for /f "tokens=1,2 delims=: " %%f in ('fsutil fsinfo volumeinfo %%e:\') do (
  7.                             if %%f==卷名 ( for /f "delims=" %%h in ('echo %%e: %%g') do (
  8.                               set drv_info=%%h____________
  9.                               set drv_info=!drv_info:~0,15!
  10.                             ))
  11.                             if %%f==文件系统名 (for /f  %%h in ('echo %%g') do (ECHO !drv_info! %%h))
  12.                     )
  13.     )
  14.                     
  15.     )
  16.     pause
复制代码
这回 XP  win10 都应该可以了。







欢迎光临 无忧启动论坛 (http://bbs.wuyou.net./) Powered by Discuz! X3.3