Board logo

标题: 求助,如何获取磁盘容量 [打印本页]

作者: beyond18wu     时间: 2008-2-21 16:56    标题: 求助,如何获取磁盘容量

用批处理写了个工具,对U盘拷贝文件(写满磁盘)然后比对文件,验证拷进去的资料是否正确。现在问题是不能自动判断U盘的容量,就不知道要写满U盘的话要拷多大的文件进去,现在只能固定死测试512M的,另外不同电脑插入U盘后显示的盘符也不一样,所以我做了很多个批处理文件,每个对应处理一个盘符。
   我现在需要解决上面的问题,就是自动获取移动磁盘盘符和容量,然后赋值给2个变量,再去做相应处理,请高手帮忙
作者: fastslz     时间: 2008-2-21 18:53
楼主是不是换了个马甲继续提问的,上次同样问题注册下,发了求助留下163邮箱地址就不管了(意思让人送代码上门)
只是我也找不到该贴了
作者: suntb     时间: 2008-2-21 19:01
这个好象置顶帖里有了 搜索下吧
作者: fastslz     时间: 2008-2-21 20:33    标题: 判断U盘可用大小,并进行文件写入测试

确定了一下那贴应该不是楼主发的,再说这段代码应用很有价值的,回复你一下了!
最后希望楼主改下标题,以便方便以后搜索
@echo off
fsutil >nul 2>nul
if "%errorlevel%"=="1"    echo 非管理员身份运行&ping/n 5 127.1>nul&exit
if "%errorlevel%"=="9009" echo 运行环境必须是 Windows XP Professional 以上系统&ping/n 5 127.1>nul&exit
for /f "skip=2 tokens=2,3 delims=," %%i in ('WMIC LogicalDisk Where "DriveType=2 and SupportsDiskQuotas=FALSE" Get DeviceID^,FreeSpace /format:csv 2^>nul') do call :xxx %%i %%j
if not defined freesize echo 未找到可移动磁盘
pause&exit

:xxx
set freesize=%2
if not defined freesize goto:eof
if exist "%1\test.txt" del /q "%1\test.txt"
echo 正在写入%freesize%字节大小的测试文件到%~1盘...
fsutil file createnew "%1\test.txt" %freesize% >nul&&echo %1 盘文件拷贝测试成功!||echo %1 盘文件拷贝测试失败
del "%1\test.txt" 2>nul
echo.
goto:eof
  该代码希望大家能收藏备用,它的价值在于能判断U盘厂商是否在flash芯片上动了手脚(奸商行为能将U盘容量加倍)去电脑城买U盘时带上这个代码肯定不让你吃亏!

[ Last edited by fastslz on 2008-2-22 at 04:48 PM ]
作者: chenai79921     时间: 2008-2-21 20:41
高手啊,,
作者: xmi     时间: 2008-2-21 20:54


  Quote:
Originally posted by fastslz at 2008-2-21 08:33 PM:
确定了一下那贴应该不是楼主发的,再说这段代码应用很有价值的,回复你一下了!
最后希望楼主改下标题,以便方便以后搜索
[code]@echo off
for /f & ...

不行, 我試過以上coding, 但都是失敗, 如下??

Q:\Documents\>rem 獲取磁盤容量
正在寫入字節大小的測試文件到Q:盤...
盤文件拷貝測試失敗

請按任意鍵繼續 . . .
作者: fastslz     时间: 2008-2-21 21:22


  Quote:
Originally posted by xmi at 2008-2-21 20:54:


不行, 我試過以上coding, 但都是失敗, 如下??

Q:\Documents\>rem 獲取磁盤容量
正在寫入字節大小的測試文件到Q:盤...
盤文件拷貝測試失敗

請按任意鍵繼續 . . .

你是繁体版系统?
作者: xmi     时间: 2008-2-21 22:15
是呀!
作者: fastslz     时间: 2008-2-21 22:22
dir/-c "%~1\"^|find "可用字节"
是简体叫它怎么find呀

  Quote:
C:\Documents and Settings\FastSLZ>dir /-c
驱动器 C 中的卷是 WINXP
卷的序列号是 4C4E-A0AB

C:\Documents and Settings\FastSLZ 的目录

2008-02-12  20:40    <DIR>          .
2008-02-12  20:40    <DIR>          ..
2007-10-06  02:41    <DIR>          Contacts
2007-09-26  22:57    <DIR>          Favorites
2008-02-12  21:05    <DIR>          Phone Browser
2007-09-27  00:25    <DIR>          WINDOWS
2007-09-27  13:59    <DIR>          「开始」菜单
2008-02-21  10:59    <DIR>          桌面
               0 个文件              0 字节
               8 个目录     1561735168 可用字节

C:\Documents and Settings\FastSLZ>

把你的贴出来
作者: xmi     时间: 2008-2-22 00:19
rem 獲取磁盤容量
@echo off
for /f "skip=1 delims= " %%a in ('"Wmic LogicalDisk Where DriveType="2" Get DeviceID|find /v "N:""') do call :xxx "%%a"
pause

:xxx
if "%~1"=="" goto:eof
if exist "%~1\test.txt" del /q "%~1\test.txt"
for /f "tokens=3" %%b in ('dir/-c "%~1\"^|find "可用字節"') do set freesize=%%b
echo 正在寫入%freesize%字節大小的測試文件到%~1盤...
fsutil file createnew "%~1\test.txt" %freesize% >nul&&echo %~1 盤文件拷貝測試成功!||echo 盤文件拷貝測試失敗
del "%~1\test.txt" 2>nul
echo.
goto:eof

以你在4樓的code做測驗...以上是了.
作者: fastslz     时间: 2008-2-22 00:39
晕繁体语法不一样的,不的简单把"可用字节"改成"可用字節"

执行命令
dir /-c
将9楼的绿色文字部分贴出来
作者: xmi     时间: 2008-2-22 01:02
C:\>dir /-c
磁碟區 C 中的磁碟沒有標籤。
磁碟區序號:  78CD-DF2F

C:\ 的目錄

2007-08-12 星期日  下午 09:37                 0 AUTOEXEC.BAT
2007-08-12 星期日  下午 09:37                 0 CONFIG.SYS
2007-08-12 星期日  下午 10:40    <DIR>          Documents and Settings
2007-12-28 星期五  下午 07:05    <DIR>          Intel
2008-02-21 星期四  下午 10:14    <DIR>          Program Files
2007-09-02 星期日  上午 11:29    <DIR>          Program Files 免安裝
2007-08-12 星期日  下午 10:04    <DIR>          TempEI4
2008-01-28 星期一  下午 11:24    <DIR>          VS2008TrainingKit
2008-02-16 星期六  上午 09:27    <DIR>          WINDOWS
               2 個檔案               0 位元組
               7 個目錄     11365900288 位元組可用

是簡體字...但我已把它轉成繁體的各呀!

[ Last edited by xmi on 2008-2-22 at 01:04 AM ]
作者: fastslz     时间: 2008-2-22 10:13
适合繁体的

  Quote:
@echo off
for /f "skip=1 delims= " %%a in ('"Wmic LogicalDisk Where DriveType="2" Get DeviceID|find /v "A:""') do call :xxx "%%a"
pause

:xxx
if "%~1"=="" goto:eof
if exist "%~1\test.txt" del /q "%~1\test.txt"
for /f "tokens=3" %%b in ('dir/-c "%~1\"^|find "位元組可用"') do set freesize=%%b
echo 正在写入%freesize%字节大小的测试文件到%~1盘...
fsutil file createnew "%~1\test.txt" %freesize% >nul&&echo %~1 盘文件拷贝测试成功!||echo 盘文件拷贝测试失败
del "%~1\test.txt" 2>nul
echo.
goto:eof


作者: beyond18wu     时间: 2008-2-22 11:06
感谢大家的回答,我试了下,上面代码能获取本地磁盘的容量,但移动磁盘容量获取不到是怎么回事
作者: fastslz     时间: 2008-2-22 11:45


  Quote:
Originally posted by beyond18wu at 2008-2-22 11:06:
感谢大家的回答,我试了下,上面代码能获取本地磁盘的容量,但移动磁盘容量获取不到是怎么回事

13楼只针对繁体版XP,简体的用4楼
作者: fastslz     时间: 2008-2-22 11:47


  Quote:
Originally posted by fastslz at 2008-2-22 11:45:

13楼只针对繁体版XP,简体的用4楼

运行环境Windows XP Professional 系统管理员身份
作者: beyond18wu     时间: 2008-2-22 12:43
我是用的4楼的,我把代码改为
@echo off
for /f "skip=1 delims= " %%a in ('"Wmic LogicalDisk Where DriveType="2" Get DeviceID|find /v "A:""') do set drivename=%%a
pause

如果电脑未接移动磁盘的话 set drivename=%%a 会是什么结果?
drivename 有没有赋值?  
  我是想当电脑未接可移动磁盘的时候提示输出 :未找到可移动磁盘

[ Last edited by beyond18wu on 2008-2-22 at 12:47 PM ]
作者: terse     时间: 2008-2-22 12:58
@echo off&color b
for /f "skip=1" %%a in ('wmic logicaldisk where "drivetype='2'" get DeviceID 2^>nul') do  set p=%%a
if "%p%"=="" echo.&echo               未找到可移动磁盘 &echo.&pause&goto :eof
for /f "tokens=2 delims==" %%i in ('wmic logicaldisk where caption^=^"%p%^" get freespace /value 2^>nul') do set m=%%i
set m3=%m:~0,7%
set m=%m:~7%
call :loop "1048576"
:loop1
if %m2% LSS 1024 echo.&cls&echo.&echo.&echo.                     %p% 盘剩余空间为 %m2% MB&pause>nul&goto :eof
set m=%m2%
set m3=%m:~0,3%
set/a m=%m:~3%*1000
for %%i in (m1 m2) do set %%i=
call :loop "1024"
for /f "delims=0 tokens=*" %%i in ("%m2%") do set m=%%i
set g=%m:~0,-3%.
set g=%g%%m:~-3,3%  G
cls
:m
echo.
echo.
echo.                     %p% 盘剩余空间为 %g%
echo.
pause>nul
goto :eof
:loop
set /a m1=%m3%%m:~0,1%/%~1
set m2=%m2%%m1%
set /a m3=%m3%%m:~0,1%%%%~1
if %m3% equ 0 set m3=
set m=%m:~1%
if not "%m%"=="" goto loop
goto :eof
作者: beyond18wu     时间: 2008-2-22 13:06
感谢18楼,非常感谢
作者: beyond18wu     时间: 2008-2-22 13:17
我想再问下:
set m3=%m:~0,7%
set m=%m:~7%
这两句看不懂,能帮解释下吗
作者: beyond18wu     时间: 2008-2-22 14:43
看懂了,字符截取
作者: fastslz     时间: 2008-2-22 16:39


  Quote:
Originally posted by beyond18wu at 2008-2-22 12:43:
我是用的4楼的,我把代码改为
@echo off
for /f "skip=1 delims= " %%a in ('"Wmic LogicalDisk Where DriveType="2" Get DeviceID|find /v "A:""') do set drivename=%%a
pause

如果电脑未接移动磁盘的话 set drivename=%%a 会是什么结果?
drivename 有没有赋值?  
  我是想当电脑未接可移动磁盘的时候提示输出 :未找到可移动磁盘

这个其实很简单最后加上if not defined freesize echo 未找到可移动磁盘就OK了

4楼代码优化过了