无效号码。数字限制为 32 位精度

Tom*_*029 4 integer cmd numbers numeric batch-file

在网上找到了这个脚本。它的工作原理是我下载它的基本原因。但我想知道一些事情:

  1. 当脚本尝试将字节划分为 KB、MG 和 GB 时,它会错误显示无效数字。数字限制为 32 位精度。
  2. 文件和目录的总数缺少右括号。

代码:

c:
cd\
@Echo ------------------------------------------------------
@Echo ------------------------------------------------------
@For /F "tokens=*" %%a IN ('"hostname"') do @Set summaryouthost=%%a
@Echo Integrity Check on: %summaryouthost%

@For /F "tokens=*" %%a IN ('"chdir"') do @Set summaryoutchdir=%%a
@Echo Integrity Check For the path: %summaryoutchdir%
@Echo ------------------------------------------------------

@For /F "tokens=*" %%a IN ('"date /T"') do @Set summaryoutsdate=%%a
@Echo Start Date: %summaryoutsdate%

@For /F "tokens=*" %%a IN ('"time /T"') do @Set summaryoutstime=%%a
@Echo Start time: %summaryoutstime%

@Echo ------------------------------------------------------
@For /F "tokens=*" %%a IN ('"dir /s /-c | find "bytes" | find /v "free""')  do @Set summaryout=%%a
::@Echo %summaryout%
@For /f "tokens=1,2 delims=)" %%a in ("%summaryout%") do @set filesout=%%a&set sizeout=%%b
@For /f "tokens=*" %%a IN ('"dir /s /-c | find "bytes free""') do @Set summaryoutdir=%%a
::@Echo %summaryoutdir%
@For /f "tokens=1,2 delims=)" %%a in ("%summaryoutdir%") do @set filesoutdir=%%a&set sizeoutdir=%%b
@Set sizeout=%sizeout:bytes=%
::@Echo %sizeout%

@Set sizeout=%sizeout: =%
@set /A inbytes=%sizeout%
@set /A inkb=(%sizeout%) / 1024
@set /A inmb=(%sizeout%) / (1024*1024)
@set /A ingb=(%sizeout%) / (1024*1024*1024)

@For /F "tokens=*" %%a IN ('"date /T"') do @Set summaryoutedate=%%a
@Echo End Date: %summaryoutedate%

@For /F "tokens=*" %%a IN ('"time /T"') do @Set summaryoutetime=%%a
@Echo End time: %summaryoutetime%

@Echo ------------------------------------------------------
@Echo Total Number of Files is:%filesout%
@Echo Total Number of Directory is: %filesoutdir%
@Set sizeoutdir=%sizeoutdir:bytes=%
::@Echo %sizeoutdir%
@Set sizeoutdir=%sizeoutdir: =%
@Echo ------------------------------------------------------
@Echo Total Size is (BY) :%sizeout%
@Echo Total Size is (KB) :%inkb%
@Echo Total Size is (MB) :%inmb%
@Echo Total Size is (GB) :%ingb%
@Echo ------------------------------------------------------
@Echo Free Space is :%sizeoutdir%
@Echo ------------------------------------------------------
@Echo ------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

输出:

------------------------------------------------------ 
------------------------------------------------------ 
Integrity Check on: Laptop01 
Integrity Check For the path: C:\ 
------------------------------------------------------ 
Start Date: Sun 10/04/2015  
Start time: 12:34 AM
------------------------------------------------------
Invalid number. Numbers are limited to 32-bits of presision.
Invalid number. Numbers are limited to 32-bits of presision.
Invalid number. Numbers are limited to 32-bits of presision.
Invalid number. Numbers are limited to 32-bits of presision.
End Date: Sun 10/04/2015   
End time: 12:36 AM  
------------------------------------------------------ 
Total Number of Files is:333914 File(s 
Total Number of Directory is: 185869 Dir(s 
------------------------------------------------------ 
Total Size is (BY) :248159912076  
Total Size is (KB) : 
Total Size is (MB) : 
Total Size is (GB) : 
------------------------------------------------------ 
Free Space is :625324642304free  
------------------------------------------------------ 
------------------------------------------------------ 
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助。

Dav*_*ill 5

数字限制为 32 位精度。

这是 的限制set /a

有关变通方法,请参阅下面的“变通方法:32 位”。

算术表达式 (SET /a)

...

这些数字必须都在 32 位有符号整数范围内(-2,147,483,648 到 2,147,483,647)才能使用 PowerShell 或 VBScript 处理更大的数字。


解决方法:32 位

32 位限制的解决方法包括:

  1. 通过截去最后 (3) 位数字来除以 1000(或 10 的任何幂)
  2. 将数字拆分为单独的十进制数字并“手动”执行所有数学运算和进位逻辑
  3. 其他脚本语言

解决方法 #1 可用于增加磁盘空间:

诀窍是将每个(大)数字视为字符串,然后将最右边的 6 个字符(数字)切掉,然后才将结果视为数字。

这是一个相当粗糙的解决方法,因为它在进行数学运算之前“四舍五入”了所有数字。

但是,将每个子目录 (%Count% / 2) 的半兆字节添加到 %Total% 确实可以补偿截断,因此总计比单个数字更准确。

请注意,这些数字并不代表“真正的”兆字节 (1024 x 1024),而是代表百万字节 (1000 x 1000)。

解决方法 #2 由 Brian Williams 的批处理文件完美展示:

解决方法 #3,其他脚本语言,不言自明。

NT 批处理文件中的数学


进一步阅读

  • Windows CMD 命令行的 AZ 索引- Windows cmd 行相关的所有内容的极好参考。

  • set - 显示、设置或删除 CMD 环境变量。使用 SET 所做的更改将仅在当前 CMD 会话期间保留。