3

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

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

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

set /a overall=%overall%/1024

Batch 返回的内容类似于“/1024 不能在语法上在这里使用”(您可能知道正确的翻译,我的是德语)。
我尝试添加/删除括号和空格,但我不断收到相同的错误。

我的语法有什么问题,我蒙着眼睛看不到吗?
如果不是,您如何调用 C++ .exe 提供 %overall% 的值以分配给 C++ 变量?(C++ 是我对基本知识知之甚少的唯一其他编程语言,PowerShell 不是一个选项,它必须是常规的 Windows Batch)

完整的相关代码:

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

3 回答 3

2

这是一些关于批处理文件及其数学限制的好信息。该页面还包含一些关于如何最好地处理这些限制的信息。

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

其中未签名为4,294,967,295,签名为-2,147,483,6482,147,483,647


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

于 2013-01-02T17:04:39.480 回答
0

我不知道批处理如何处理数字,但我认为使用 C++ 会是更好的选择,因为您可以使用 anintlong来处理您需要的任何数字。

您可以使用将您的号码传递给您的 C++ 应用程序

yourcpp.exe !overall! 1024

并使用main's 参数将它们取出并将它们分开(我的 C++ 不是很好,但应该这样做)

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

然后你可以按照你的意愿存储它,也许输出到一个文本文件,你可以使用批处理文件读取它。

于 2013-01-02T14:14:28.793 回答
0

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

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

如果我尝试266,173,879/1024,它总是返回0,这不好。如果我尝试266.173.879/1024,它会显示“缺少操作员”,这也不对。

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

set /a overall=/1024

那当然是 invalid 并返回 error missing operand,这与上面提到的略有不同missing operator

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

之后它应该工作:

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

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

于 2013-01-02T17:15:40.980 回答