Batch file 如何在批量中划分可能较大的数字?

Batch file 如何在批量中划分可能较大的数字?,batch-file,progress,division,Batch File,Progress,Division,我的问题涉及到我正在编写的脚本,该脚本使用批处理文件自动备份多个文件夹和子文件夹。 现在,我正在尝试以可读的格式实现某种进度指标,最好是百分比。 首先,它使用以下命令读取要复制的总大小: FOR /R "C:\Users\XXX" %%F IN (*.*) DO ( set /a overall=!overall!+%%~zF ) 对于我的测试批处理中的特定文件夹,这将返回266173879字节的大小。 但是,如果我尝试在for循环之后将这个数字除以1024(表示KB) set /a over

我的问题涉及到我正在编写的脚本,该脚本使用批处理文件自动备份多个文件夹和子文件夹。
现在,我正在尝试以可读的格式实现某种进度指标,最好是百分比。
首先,它使用以下命令读取要复制的总大小:

FOR /R "C:\Users\XXX" %%F IN (*.*) DO (
set /a overall=!overall!+%%~zF
)
对于我的测试批处理中的特定文件夹,这将返回266173879字节的大小。
但是,如果我尝试在for循环之后将这个数字除以1024(表示KB)

set /a overall=%overall%/1024
批处理返回“/1024不能在此语法上使用”(您可能知道正确的翻译,我的是德语)。
我试着添加/删除偏执主题和空格,但我总是遇到同样的错误

我的语法有什么问题吗?我被蒙得眼睛都看不见了?
如果不是,您如何调用将%%的总体值分配给C++变量的C++? (C++是我仅有的一种编程语言,我对它的基本知识知之甚少,PowerShell不是一种选项,它必须是常规的Windows批处理)

完整的相关代码:

FOR /R "C:\Users\XXX" %%F IN (*.*) DO (
set /a overall=!overall!+%%~zF
)

set /a overall=%overall%/1024

FOR /R "C:\Users\XXX" %%F IN (*.*) DO (
xcopy "%%F" "E:%%~pF" %parameter%>nul
cls
echo Copying... Progress: !size! of !overall! KB copied.
)

< P>我不知道批量是如何处理数字的,但我认为使用C++是一个更好的选择,因为你可以使用<代码> int <代码>,<代码>长< /Cuff>等。 <>你可以用

把你的数字传给你的C++应用程序
yourcpp.exe !overall! 1024

并使用<代码>主< <代码>的参数来对它们进行排序并将它们分开(我的C++不是很好,但类似的事情应该做)


然后,您可以按照自己的方式存储它,也许您可以使用批处理文件来读取它。

以下是有关批处理文件及其数学限制的一些好信息。该页面还提供了一些关于如何最好地处理这些限制的信息

批处理数学有一个严重的限制:它只能处理32位整数。

对于未签名的,−2147483648至2147483647签名



为简单起见,如果您使用的是Windows 2003/XP或更高版本,您可能只想研究一下如何使用。请注意,必须安装(适用于XP)才能添加robocopy工具。有关所有功能和日志选项,请参见robocopy链接。

该错误表明表达式存在语法错误。您尝试设置的数字是2.6亿,这在batch可以处理的32位数字的最大精度范围内是安全的

我认为问题在于该值实际上是
266173879
,包括逗号。根据您的本地化设置,分区可能会故障转移这些字符

如果我尝试
266173879/1024
,它总是返回
0
,这是不好的。 如果我尝试266.173.879/1024,它会显示“缺少操作员”,这也不正确

另一种可能性是,
%total%
第一次没有得到值。这使表达式看起来像

set /a overall=/1024
当然,这是无效的,并返回错误
缺少操作数
,这与上面提到的
缺少运算符
略有不同

如果您认为最安全的方法是首先确保%overall%有一个值,然后尝试从字符串中删除逗号

在这之后,它应该会起作用:

C:\>set /a overall=266173879/1024
259935

请注意,当您的目录大于2GB时,您会遇到麻烦。

robocopy
是一个很好的技巧,但32位限制不是这里的问题。@GolezTrol,我同意。因此,为什么我有32位int的最大值。我把它放进去是为了明确表明大小不是问题所在,并试图诱使OP转到包含更多信息的链接<代码>:)
C:\>set /a overall=266173879/1024
259935