复制命令和Excel文件的意外结果


4

从Windows批处理文件执行“复制”命令时我注意到一些奇怪的事情,并且想知道是否有人之前遇到过此问题并且可以解释原因。

我在批处理文件中有一行,它将Excel文件从位置A复制到位置B,并且还重命名该文件。例如:

Copy \\server\share\folder\locationA\file_*.xlsx \\server\share\folder\locationB\file.xlsx /y

副本看起来很好,因为Excel文件存在于位置B,但是当我打开文件时,我收到一条错误消息,指出:

“Excel无法打开文件...因为文件格式或文件扩展名无效。请验证文件是否已损坏,文件扩展名是否与文件格式匹配。”

我使用上面的命令行运行了一些测试,并注意到只有在A部分的文件名中使用通配符时才会出现此问题。例如,文件副本,我可以使用此命令打开它:

Copy \\server\share\folder\locationA\file_LongName.xlsx \\server\share\folder\locationB\file.xlsx /y

我意识到有很多方法可以解决这个问题,但我对解决方案不感兴趣,我对解释感兴趣。我的问题是为什么会发生这种情况?

Answers:


3

您遇到此问题的原因是通配符模式将COPY命令切换为串联模式,该模式专为纯文本ASCII文件而设计。在ASCII模式下,二进制文件中的某些数据看起来像“文件结束”字符。


Excel .XLSX文件本质上是Zip存档,具有不同的扩展名,Zip存档是二进制文件,而不是ASCII。该COPY命令将此二进制文件视为ASCII文件,并尝试将内容与任何内容连接。

有人可能会认为连接一个没有任何内容的文件会给你开头的文件,但在这种情况下不会。

COPY命令仅继续处理文件,直到它到达文件结束(EOF)字符。一旦到达此字符,它将继续到下一个文件。(在这种情况下,它会完全停止处理。)

二进制Excel文件包含的数据在转换为ASCII时表示EOF字符,因此文件的串联早于预期结束。

为了说明这一点,我使用您的COPY命令将7zip文件与空白Excel文件连接(我只是将它们重命名为file_1.xlsxfile_2.xlsx)。我在Notepad ++中打开了7zip文件和输出文件,并使用WinMerge比较了内容。

WinMerge比较

正如您在图像中看到的那样,这两个文件在(1A)角色之前是相同的。

接下来,我连接了两个纯文本文件,这些文件完美无缺。但是,一旦我将这个(1A)字符(在Notepad ++中显示为(sub))插入到其中一个文本文件中,我就能确认COPY命令在该点完全停止并转移到下一个文件。

Notepad ++中的连接


哇,这是一个彻底的答案。非常感谢你!
罗杰21年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.