我的问题与我正在编写的脚本有关,它会自动使用批处理文件备份多个文件夹和子文件夹 现在我正试图以可读的格式实施某种进度指标,最好是百分之一 首先,它使用以下命令读取要复制的总大小:
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.
)
答案 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 ++是一个更好的选择,因为你可以使用int
,long
等,无论你需要什么数字。
您可以使用
将数字传递给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不会妨碍我的使用?
非常感谢!