Пакет script для объединения файлов без Hex char 1A в конце

Я объединяю два файла ASCII через простой пакет script, как этот

COPY a.txt+b.txt c.txt /y /a

Проблема в том, что последний символ в C получает значение 1A, обозначение HEX для SUB. c.txt передается в другой исполняемый файл, который не нравится 1A в конце.

После сгенерирования c.txt, если я его открываю в Notepad ++ и удаляю последний символ, файл отлично работает.

Как я могу объединить a.txt и b.txt без добавления 1A в конец c.txt?

Ответы

Ответ 1

Размещение переключателей /a и /b является критическим. Они выполняются по-разному в зависимости от того, размещены ли они после имени исходного файла (ов) или целевого имени файла.

При использовании с целевым именем файла /a добавляется маркер конца файла (ASCII 26). Вы на самом деле указываете это!

При использовании с исходным именем файла

/a указывает, что файл является ASCII, и он копируется до, но не включает первую метку конца ASCII 26 конца файла. Этот символ и все после него игнорируются.

/b приводит к копированию всего файла, включая любые маркеры конца файла и что-то после них.

При использовании с именем файла назначения

/a вызывает добавление ASCII 26 в качестве последнего символа.

/b не добавляет ASCII 26 в качестве последнего символа.

Ваше решение

... хотя я его не тестировал, вероятно, использовать

COPY a.txt+b.txt /a c.txt /b /y

Ответ 2

Вы можете изменить переключатель /a (ASCII-текст) на /b (двоичный)
Посмотрите также на copy /?

поэтому итоговая команда

COPY a.txt+b.txt c.txt /y /b

Ответ 3

Изменить с copy на type

type a.txt>c.txt
type b.txt>>c.txt

Ответ 4

Я думал, что образец @Andrew был неправильным, но он был более правильным, чем мой.

Дело в том, что спецификатор [/A | /B] работает в обоих направлениях. И это смущает. copy /? показывает [/A |/B] перед первым исходным файлом, но также после каждого другого источника, а также после адресата

КОПИЯ... [/A |/B] источник [/A |/B] [+ источник [/A |/B]...] [назначение [/A |/B]]

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

Совмещение команды копирования по умолчанию с ASCII
Образец.

copy aa + bb + cc dd
ASCII ASCII ASCII ASCII

Укажите все файлы, которые нужно скопировать как двоичные, следующие три образца имеют одинаковый эффект:

copy /b aa + bb + cc dd
bin bin bin bin

copy aa /b + bb + cc dd
bin bin bin bin

copy aa + /b bb + cc dd
bin bin bin bin

и еще несколько тестов:

copy aa + bb /a + cc dd
ASCII ASCII ASCII ASCII

copy aa + bb /b + cc dd
ASCII BIN BIN BIN

copy /b aa + bb + cc dd /a
bin bin bin ascii

copy aa /a + bb + cc dd /b
ASCII ASCII ASCII bin

copy aa + bb + cc dd /b
ASCII ASCII ASCII bin

copy aa + bb + cc /a dd /b
ASCII ASCII ASCII bin

Но если повторное использование источника в качестве адресата, тип назначения переопределяет тип источника в том же файле:

copy aa + bb + cc aa /b
BIN ASCII ASCII BIN

copy aa + bb + cc /b aa
BIN ASCII BIN BIN

Это означает, что мой оригинальный образец фактически копировал все файлы в виде двоичных файлов, а /A в начале был переопределен. Теперь он делает то же самое, но выглядит лучше.

@Образец Андрея делает то, что он обещал, он просто /A бесполезен там.


Если вы хотите добавить один файл в другой, вам не нужен третий файл. просто используйте первый раз как пункт назначения. Не может быть вторым, или вы будете перезаписывать его перед чтением.

это script Я использую для объединения всех текстовых файлов из списка файлов.

@echo off

set concatenated=final.js

pushd %~dp0

set error=
copy nul "%concatenated%"
if errorlevel 1 set error=true

for /f %%a in (filelist.txt) do (
    echo. && echo.
    echo.   *** %%a
    copy /B /V "%concatenated%" + "%%a" "%concatenated%"
    if errorlevel 1 set error=true
)

popd
echo.
if defined error (echo.   !!!!!!!!!  THERE WERE ERRORS  !!!!!!!!!!
) else echo.   ***  ALL DONE  ***
echo.
pause
exit /b