Пакет 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