[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] [已解决]批处理计算数值不能被除整求解答-磁盘容量均分

本帖最后由 yakeyun 于 2021-7-15 14:52 编辑
  1. @echo off
  2. partassist.exe /list /out:1.txt
  3. for /f "skip=3 delims=| tokens=2,3" %%i in (1.txt) do for /f " delims=GB" %%k in ("%%i") do echo %%k
  4. pause
复制代码
已知代码获取到的值如下:

========================================================================
下面是第二个代码,主要是找出新硬盘,如果可用容量和总容量相等,就说明有硬盘没有分区出来。其已经可以实现自动判断小于500G硬盘分一个区,大于500G平分3个区的目的了。
但是diskpart命令无法获取磁盘容量后面的小数位,所以均分容量有瑕疵,想完美优化一下代码。求大佬帮忙看下是否可以把代码和代码之间相互调用,自己尝试加过,技术有限不能实现。
我是先让%%k输出为data.ini ,然后用:for /f "delims=" %%m in ('more "c:\data.ini" ^| find "%%b"') do  echo,%%m         运行后m值不显示

========================================================================
  1. :main
  2. setlocal enabledelayedexpansion
  3. set flag=0
  4. for /f "skip=1 tokens=2,4-7" %%a in ('echo list disk^|diskpart^|find "磁盘"') do (
  5.     if "%%b%%c" == "%%d%%e" (
  6.     set flag=1
  7.     set name=%%a
  8.     set name2=%%b
  9. )
  10. )
  11. if !flag!==1 (
  12. if !name2! GTR 500 (goto bug500)
  13. if !name2! LSS 500 (goto min500)
  14. :bug500
  15. set /a name2=!name2!*1024/3
  16. set /a name3=!name2!*2
  17. ::删除所有分区
  18. C:\Intel\10\PACMD\partassist.exe /hd:%name% /del:all
  19. ::初始化磁盘
  20. C:\Intel\10\PACMD\partassist.exe /init:%name% /gpt
  21. ::在磁盘的第一块未分配空间中创建1T的三分之一容量分区
  22. C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /align /label:HDD1 /letter:auto
  23. C:\Intel\10\PACMD\partassist.exe /hd:%name% /resize:0 /reduce-right:!name3!
  24. C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /label:HDD2 /letter:auto
  25. C:\Intel\10\PACMD\partassist.exe /hd:%name% /resize:1 /reduce-right:!name2!
  26. C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /label:HDD3 /letter:auto
  27. msg %username% "自动分区完成!"
  28. goto main
  29. :min500
  30. ::删除所有分区
  31. C:\Intel\10\PACMD\partassist.exe /hd:%name% /del:all
  32. ::初始化磁盘
  33. C:\Intel\10\PACMD\partassist.exe /init:%name% /gpt
  34. ::将磁盘所有空间分配为一个分区
  35. C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /align /label:HDD /letter:auto
  36. msg %username% "自动分区完成!"
  37. goto main
  38. )
复制代码

是这样吗?
   :main
    setlocal enabledelayedexpansion
    set flag=0
    for /f "skip=1 tokens=2,4-7" %%a in ('echo list disk^|diskpart^|find "磁盘"') do (
        if "%%b%%c" == "%%d%%e" (
        set flag=1
        set name=%%a
        for /f "delims=" %%m in ('more "c:\data.ini" ^| find "%%b"') do  echo,%%m  & set name2=%%m
    )
    )
    if !flag!==1 (
    if !name2! GTR 500 (goto bug500)
    if !name2! LSS 500 (goto min500)
    :bug500
    set /a name2=!name2!*1024/3
    set /a name3=!name2!*2
    ::删除所有分区
    C:\Intel\10\PACMD\partassist.exe /hd:%name% /del:all
    ::初始化磁盘
    C:\Intel\10\PACMD\partassist.exe /init:%name% /gpt
    ::在磁盘的第一块未分配空间中创建1T的三分之一容量分区
    C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /align /label:HDD1 /letter:auto
    C:\Intel\10\PACMD\partassist.exe /hd:%name% /resize:0 /reduce-right:!name3!
    C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /label:HDD2 /letter:auto
    C:\Intel\10\PACMD\partassist.exe /hd:%name% /resize:1 /reduce-right:!name2!
    C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /label:HDD3 /letter:auto
    msg %username% "自动分区完成!"
    goto main
    :min500
    ::删除所有分区
    C:\Intel\10\PACMD\partassist.exe /hd:%name% /del:all
    ::初始化磁盘
    C:\Intel\10\PACMD\partassist.exe /init:%name% /gpt
    ::将磁盘所有空间分配为一个分区
    C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /align /label:HDD /letter:auto
    msg %username% "自动分区完成!"
    goto main
    )

TOP

本帖最后由 yakeyun 于 2021-7-12 09:14 编辑

回复 2# idwma

二楼调用思路是对的,后面数值不能参与比较和计算。我再研究下看看,应该是哪里还是有问题。
已经找到原因,如果数值出现了小数后,name2的值不能用!name2!或者%name2%,不然比较和计算的时候就会报错[5楼最下面批处理显示的是报错图片]。

TOP

本帖最后由 yakeyun 于 2021-7-12 09:15 编辑

回复 3# yakeyun

下面是最终修改的代码,已经可以实现小数容量获取,但是计算的时候还是不会被均分,不知道是何缘故:

@echo off
@IF exist data.ini (del data.ini)
partassist.exe /list /out:1.txt
for /f "skip=3 delims=| tokens=2,3" %%i in (1.txt) do for /f " delims=GB" %%k in ("%%i") do echo %%k >>data.ini

:main
setlocal enabledelayedexpansion
set flag=0
for /f "skip=1 tokens=2,4-7" %%a in ('echo list disk^|diskpart^|find "磁盘"') do (
if "%%b%%c" == "%%d%%e" (
set flag=1
set name=%%a
set GB=%%b
for /f "delims=" %%m in ('more "data.ini" ^| find "%%b"') do  echo,%%m&set name2=%%m
)
)
if !flag!==1 (
if [color=name2 GTR 50 (goto bug500)
if [color=name2 LSS 50 (goto min500)
:bug500
set /a name2=name2*1024/3
set /a name3=name2*2
::删除所有分区
C:\Intel\10\PACMD\partassist.exe /hd:%name% /del:all
::初始化磁盘
C:\Intel\10\PACMD\partassist.exe /init:%name% /gpt
::在磁盘的未分配空间中创建总容量的三分之一容量分区
C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /align /label:HDD1 /letter:auto
C:\Intel\10\PACMD\partassist.exe /hd:%name% /resize:0 /reduce-right:!name3!
C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /label:HDD2 /letter:auto
C:\Intel\10\PACMD\partassist.exe /hd:%name% /resize:1 /reduce-right:!name2!
C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /label:HDD3 /letter:auto
msg %username% "自动分区完成!"
goto main
:min500
::删除所有分区
C:\Intel\10\PACMD\partassist.exe /hd:%name% /del:all
::初始化磁盘
C:\Intel\10\PACMD\partassist.exe /init:%name% /gpt
::将磁盘所有空间分配为一个分区
C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /align /label:HDD /letter:auto
msg %username% "自动分区完成!"
goto main
)
exit

测试结果如下:

磁盘状况:



后面我已经修改好了,不过第一个分区会出现小数点分区,后面2个是整数分区,所以还是不能实现均分。
下面是最终的效果,不知道是哪里的原因,数值最终依然不能均分,有知道的大佬或者管理麻烦解答一下。

TOP

回复 4# yakeyun
利用Pause截获数据,发现是在计算步骤出现了问题,麻烦大佬解惑一下

if !flag!==1 (
if !GB! GTR 50 (goto bug500)
if !GB! LSS 50 (goto min500)
:bug500
echo 大于50G
pause
set /a name2=!name2!*1024/3
set /a name3=!name2!*2
echo name2
echo name3
pause

显示结果:

TOP

本帖最后由 idwma 于 2021-7-11 19:37 编辑

一定要用小数吗?那先把.去掉算完再把.加上
像这里的111.79用set/a 11179*1024/3得到3815765加个.变成38157.65
set /a name2=!name2:.=!*1024/3
set /a name3=!name2!*2
set name2=!name2:~0,-2!.!name2:~-2!
set name3=!name3:~0,-2!.!name3:~-2!

TOP

如果是小数导致问题,把小数部分去掉
前面分区容量,取整, 50 80 100

TOP

回复 7# newswan

已经将程序分享出来了,有需要批量自动分区的小伙伴可以下载使用。
https://www.lanzoui.com/idss3ray86f
程序可以实现开机自动判断电脑中未分区的新硬盘,并根据容量实现自动分区,如果有多个新硬盘就会分区完一个硬盘后,循环判断是否存在其它未分区的硬盘,直到所有硬盘全部分出来,结束判断。
最终代码:


@echo off
@IF exist data.ini (del data.ini)
partassist.exe /list /out:1.txt
for /f "skip=3 delims=| tokens=2,3" %%i in (1.txt) do for /f " delims=GB" %%k in ("%%i") do echo %%k >>data.ini
:main
setlocal enabledelayedexpansion
set flag=0
for /f "skip=1 tokens=2,4-7" %%a in ('echo list disk^|diskpart^|find "磁盘"') do (
if "%%b%%c" == "%%d%%e" (
set flag=1
set name=%%a
set GB=%%b
for /f "delims=" %%m in ('more "data.ini" ^| find "%%b"') do  echo,%%m&set name2=%%m
)
)
if !flag!==1 (
::这里的50是指比较硬盘容量大小,如果大于50G就跳转到均分3分区代码位置,如果小于50G就跳转到全部容量分一个区。
if name2 GTR 50 (goto bug500)
if name2 LSS 50 (goto min500)
:bug500
echo 大于50G
pause
set /a name2=name2*1024/3
set /a name3=name2*2
echo !name2!
echo !name3!
::删除所有分区
C:\Intel\10\PACMD\partassist.exe /hd:%name% /del:all
::初始化磁盘
C:\Intel\10\PACMD\partassist.exe /init:%name% /gpt
::在磁盘的第一块未分配空间中创建1T的三分之一容量分区
C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /align /label:HDD1 /letter:auto
C:\Intel\10\PACMD\partassist.exe /hd:%name% /resize:0 /reduce-right:!name3!
C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /label:HDD2 /letter:auto
C:\Intel\10\PACMD\partassist.exe /hd:%name% /resize:1 /reduce-right:!name2!
C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /label:HDD3 /letter:auto
msg %username% "自动分区完成!"
goto main
:min500
echo 小于50G
pause
::删除所有分区
C:\Intel\10\PACMD\partassist.exe /hd:%name% /del:all
::初始化磁盘
C:\Intel\10\PACMD\partassist.exe /init:%name% /gpt
::将磁盘所有空间分配为一个分区
C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /align /label:HDD /letter:auto
msg %username% "自动分区完成!"
goto main
)
exit

TOP

本帖最后由 newswan 于 2021-7-12 13:30 编辑

以前用 diskpart ,现在准备用 powershell ,支持 powershell 的 pe 会大一圈,还没测试过。
至少powershell 下能识别 的信息要多一些
尽量用大分区,不习惯一个硬盘平均分成几个分区

TOP

本帖最后由 yakeyun 于 2021-11-6 10:14 编辑

回复 9# newswan

折腾了几天,总算完美解决,容量可以均分。下面是代码:

@echo off
:main
::清理战场
@IF exist data.ini (del data.ini)
@IF exist data0.ini (del data0.ini)
@IF exist 1.txt (del 1.txt)
@IF exist name2.txt (del name2.txt)
C:\Intel\10\PACMD\partassist.exe /list /out:1.txt
for /f "skip=3 delims=| tokens=2,3" %%i in (1.txt) do for /f " delims=GB" %%k in ("%%i") do echo %%k >>data.ini
setlocal enabledelayedexpansion
set flag=0
for /f "skip=1 tokens=2,4-7" %%a in ('echo list disk^|diskpart^|find "磁盘"') do if "%%b%%c" == "%%d%%e" (
set flag=1
::============================================
for /f " delims=" %%q in ("%%a") do echo %%q >data0.ini
for /f %%r in ('type "data0.ini"') do echo %%r &set name=%%r
::============================================
set GB=%%b
for /f "delims=" %%m in ('more "data.ini" ^| find "%%b"') do  echo,%%m >name2.txt
for /f %%x in ('type "name2.txt"') do echo %%x &set name2=%%x
)
)
if !flag!==1 (
::下面的200是指要比较的硬盘容量大小,可以根据需要修改,作者的是小于500G全部分一个区,大于500G均分三个区。
if %name2% GTR 200 (goto bug500)
if %name2% LSS 200 (goto min500)
:bug500
::=======================================
for /f "delims=. tokens=1,2" %%d in ('echo,%name2%') do (
set a11=%%d
set a22=%%e
set /a a1=a11*1024/3
set /a a2=a22*1024/3
)
for /f "delims=. tokens=1,*" %%k in ('echo %a2:~0,-2%') do (
set b1=%%k
set /a name3=a1+b1
set /a name4=name3*2
)
::=======================================
::删除所有分区
C:\Intel\10\PACMD\partassist.exe /hd:%name% /del:all
::初始化磁盘
C:\Intel\10\PACMD\partassist.exe /init:%name% /gpt
::在磁盘的第一块未分配空间中创建1T的三分之一容量分区
C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /align /label:HDD1 /letter:auto
C:\Intel\10\PACMD\partassist.exe /hd:%name% /resize:0 /reduce-right:!name4!
C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /label:HDD2 /letter:auto
C:\Intel\10\PACMD\partassist.exe /hd:%name% /resize:1 /reduce-right:!name3!
C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /label:HDD3 /letter:auto
goto main
:min500
::删除所有分区
C:\Intel\10\PACMD\partassist.exe /hd:%name% /del:all
::初始化磁盘
C:\Intel\10\PACMD\partassist.exe /init:%name% /gpt
::将磁盘所有空间分配为一个分区
C:\Intel\10\PACMD\partassist.exe /hd:%name% /cre /pri /size:auto /fs:ntfs /align /label:SSD /letter:auto
goto main
)
msg %username% "自动分区完成!"
::清理战场
@IF exist data.ini (del data.ini)
@IF exist data0.ini (del data0.ini)
@IF exist 1.txt (del 1.txt)
@IF exist name2.txt (del name2.txt)
exit

最终分区效果,小于200G自动分一个区,大于200G分3个区。如果有多个未分区的新硬盘,会循环判断,直到不存在未分区的硬盘为止。



软件打包下载:https://www.lanzoui.com/iuDYnrfypja

TOP

回复 10# yakeyun


    均分强迫症

TOP

返回列表