如何在Batch中划分可能的大数字?

时间:2013-01-02 14:05:18

标签: batch-file progress division

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

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

对于我的测试批次中的特定文件夹,返回的大小为266,173,879字节 但是,如果我尝试在for循环之后将此数字除以1024(对于Kilobytes)

set /a overall=%overall%/1024

Batch返回的内容是“/ 1024不能在语法上使用”(你可能知道正确的翻译,我的是德语)。
我尝试添加/删除parantheses和空格,但我一直得到同样的错误。

我的语法是否有问题,我太蒙眼了看? 如果没有,你如何调用C ++ .exe提供%total%的值来分配给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.
)

4 个答案:

答案 0 :(得分:2)

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

  

批处理数学存在严重限制:它只能处理32位整数。   的 http://www.robvanderwoude.com/battech_math.php

未签名 4,294,967,295 -2,147,483,648 2,147,483,647 签名。


为简单起见,如果您使用的是Windows 2003 / XP或更高版本,则可能只想使用 robocopy 。请注意,您必须安装 Windows Resource Pack (Works on XP)才能添加robocopy工具。有关所有功能和日志记录选项,请参阅robocopy链接。

答案 1 :(得分:0)

我不知道批处理如何处理数字,但我认为使用C ++是一个更好的选择,因为你可以使用intlong等,无论你需要什么数字。

您可以使用

将数字传递给C ++应用
yourcpp.exe !overall! 1024

并使用main的参数进行选择并将它们分开(我的C ++不是很好,但是这样的事情应该这样做)

int main(int argc, char* argv[]) {
double n = (double)argv[0]/(double)argv[1];
return 0;
}

然后您可以按照您想要的方式存储它,也许output to a text file,您可以使用批处理文件读取它。

答案 2 :(得分:0)

该错误表明该表达式存在语法错误。您尝试设备的数量为2.6亿,安全地在批处理可以处理的32位数的最大精度范围内。

我认为问题是该值实际为266,173,879,包括逗号。根据您的本地化设置,该部门可能会对这些字符进行故障转移。

如果我尝试266,173,879/1024,它总是返回0,这不好。 如果我尝试266.173.879/1024,它会说'缺少运算符',这也不对。

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

set /a overall=/1024

当然,这是无效的,并返回错误missing operand,这与上面提到的missing operator略有不同。

如果认为最安全的事情是确保%overall%首先具有值,并尝试从字符串中删除逗号。

之后它应该有效:

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

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

答案 3 :(得分:0)

由于某种原因,它现在似乎工作!我想我在原始批处理中只有一些奇怪的语法错误,我没有复制到我的问题......

你是对的大小>虽然是2GB,但我想我将使用David的链接建议的解决方法之一。

至于robocopy,xcopy有我需要的所有开关(我希望),如果没有,我将不得不将robocopy.exe附加到我的批处理,因为我没有计算机的管理员权限,我想要运行。 xcopy是否有任何限制,Robocopy不会妨碍我的使用?

非常感谢!