
标题: [数值计算] [已解决]批处理计算数值不能被除整求解答-磁盘容量均分 [打印本页]
作者: yakeyun 时间: 2021-7-11 14:17 标题: [已解决]批处理计算数值不能被除整求解答-磁盘容量均分
本帖最后由 yakeyun 于 2021-7-15 14:52 编辑
- @echo off
- 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
- pause
复制代码
已知代码获取到的值如下:

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

========================================================================- :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 name2=%%b
- )
- )
- 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
- )
复制代码
作者: idwma 时间: 2021-7-11 14:55
是这样吗?
: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
)
作者: yakeyun 时间: 2021-7-11 15:19
本帖最后由 yakeyun 于 2021-7-12 09:14 编辑
回复 2# idwma
二楼调用思路是对的,后面数值不能参与比较和计算。我再研究下看看,应该是哪里还是有问题。
已经找到原因,如果数值出现了小数后,name2的值不能用!name2!或者%name2%,不然比较和计算的时候就会报错[5楼最下面批处理显示的是报错图片]。
作者: yakeyun 时间: 2021-7-11 16:13
本帖最后由 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个是整数分区,所以还是不能实现均分。
下面是最终的效果,不知道是哪里的原因,数值最终依然不能均分,有知道的大佬或者管理麻烦解答一下。

作者: yakeyun 时间: 2021-7-11 17:59
回复 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
显示结果:

作者: idwma 时间: 2021-7-11 19:21
本帖最后由 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!
作者: newswan 时间: 2021-7-11 19:31
如果是小数导致问题,把小数部分去掉
前面分区容量,取整, 50 80 100
作者: yakeyun 时间: 2021-7-12 09:32
回复 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
作者: newswan 时间: 2021-7-12 13:26
本帖最后由 newswan 于 2021-7-12 13:30 编辑
以前用 diskpart ,现在准备用 powershell ,支持 powershell 的 pe 会大一圈,还没测试过。
至少powershell 下能识别 的信息要多一些
尽量用大分区,不习惯一个硬盘平均分成几个分区
作者: yakeyun 时间: 2021-7-15 15:16
本帖最后由 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
作者: newswan 时间: 2021-7-15 17:30
回复 10# yakeyun
均分强迫症
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |