3

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

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

1 ответ1

3

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


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

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

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

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

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

Сравнение WinMerge

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .