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

4

Я заметил нечто странное, когда выполнял команду «Копировать» из командного файла 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

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

roger21
источник

Ответы:

3

Причина, по которой вы видите эту проблему, заключается в том, что шаблон с подстановочными знаками переключает 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

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

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

Конкатенация в Notepad ++

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