Пакетный скрипт для объединения файлов без Hex char 1A в конце - PullRequest
21 голосов
/ 14 марта 2012

Я объединяю два ASCII-файла с помощью простого пакетного сценария, подобного этому

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?

Ответы [ 4 ]

30 голосов
/ 14 марта 2012

Размещение переключателей /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

1 голос
/ 21 января 2017

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

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

COPY ... [/ 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 там бесполезен.


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

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

@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 
1 голос
/ 20 января 2014

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

type a.txt>c.txt
type b.txt>>c.txt
1 голос
/ 14 марта 2012

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

, поэтому полученная команда будет

COPY a.txt+b.txt c.txt /y /b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...