Неожиданные результаты с помощью команды «Копировать» и файлов Excel

420
roger21

Я заметил нечто странное, когда выполнял команду «Копировать» из пакетного файла Windows, и мне было интересно, сталкивался ли кто-нибудь с этим раньше и может ли объяснить причину.

У меня есть строка в командном файле, которая копирует файл Excel из местоположения A в местоположение B, а также переименовывает файл. Например:

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

Копия выглядит так, как будто она завершается нормально, поскольку Excel находится в папке B, однако, когда я открываю файл, я получаю сообщение об ошибке, в котором говорится:

«Excel не может открыть файл ... потому что формат файла или расширение файла недействительно. Убедитесь, что файл не был поврежден и что расширение файла соответствует формату файла».

Я выполнил несколько тестов с помощью приведенной выше командной строки и заметил, что эта проблема возникает только в том случае, если я использую подстановочный знак в имени файла в части А. Например, файл копируется, и я могу прекрасно его открыть с помощью этой команды:

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

Я понимаю, что существует множество способов исправить это, но я не заинтересован в решении, я заинтересован в объяснении. Мой вопрос: почему это происходит?

3

1 ответ на вопрос

3
Worthwelle

Причина, по которой вы видите эту проблему, заключается в том, что шаблон с подстановочными знаками переключает COPYкоманду в режим конкатенации, который предназначен для простых текстовых файлов ASCII. В режиме ASCII некоторые данные в двоичных файлах выглядят как символ «конец файла».


Файлы Excel .XLSX - это, по сути, Zip-архивы с другим расширением, а Zip-архивы - это двоичные файлы, а не ASCII. Команда COPYобрабатывает этот двоичный файл как ASCII-файлы и пытается объединить содержимое без чего-либо.

Можно подумать, что объединение файла без чего-либо даст вам тот же файл, с которого вы начали, но не в этом случае.

Команда COPYпродолжает обрабатывать файл только до тех пор, пока он не достигнет символа конца файла (EOF) . Как только он достигает этого символа, он переходит к следующему файлу. (В этом случае обработка полностью прекращается.)

Ваши двоичные файлы Excel содержат данные, которые при преобразовании в ASCII представляют символы EOF, и поэтому конкатенация файла заканчивается раньше, чем ожидалось.

Чтобы проиллюстрировать это, я использовал вашу COPYкоманду для объединения 7zip-файла с пустым файлом Excel (я просто переименовал их в file_1.xlsxand file_2.xlsx). Я открыл 7zip-файл и выходной файл в Notepad ++ и сравнил содержимое с помощью WinMerge.

WinMerge comparison

Как вы можете видеть на изображении, два файла идентичны вплоть до (1A)символа.

Затем я объединил два простых текстовых файла, которые работали безупречно. Однако, как только я вставил этот (1A)символ (который отображается в Notepad ++ как (sub)) в один из текстовых файлов, я смог подтвердить, что COPYкоманда остановилась именно в этот момент и перешел к следующему файлу.

Concatenation in Notepad++

Вау, какой исчерпывающий ответ. Большое спасибо за это! roger21 6 лет назад 0

Похожие вопросы