Войти

Показать полную графическую версию : [решено] вставить две пустых строки в copy bin


shadowbat
24-02-2022, 16:30
Есть код
chcp 1251
copy /b *.* "! merged.bin"
pause

как сделать так, чтобы между каждым файлом было по 2 пустых строки 0A 0D ? (или 0D 0A)

ф1с1
ф1с2


ф2с1
ф2с2

Serguei Kouzmine
24-02-2022, 18:28
перефразируете замысел!

shadowbat
24-02-2022, 18:56
как сделать бинарный объединятор bin1 + 0D0A0D0A + bin2 + 0D0A0D0A + ... bin100 + 0D0A0D0A ?

есть первый файл
hex
313131310D0A31310D0A3131
либо txt
1111
11
11

есть второй файл
hex
323232320D0A32320D0A3232
либо txt
2222
22
22

после запуска скрипта должен получиться
hex
323232320D0A32320D0A32320D0A0D0A313131310D0A31310D0A31310D0A0D0A
txt
2222
22
22

1111
11
11




а кодом из 1го сообщения получается так
hex
323232320D0A32320D0A3232313131310D0A31310D0A3131
txt
2222
22
221111
11
11

https://i.imgur.com/nimGeHV.png

Serguei Kouzmine
25-02-2022, 03:09
создайте файл file0 c содержимым 0D0A0D0A любым доступным вам способом и задача сведется к
copy /b file1 file0 file2 file0 file3 file0 .... "! merged.bin"

shadowbat
25-02-2022, 06:14
copy /b file1 file0 file2 file0 file3 file0 .... "! merged.bin" »
без плюсов пишет ошибка в синтаксисе, так соединяет:
chcp 1251
copy /b "11.txt.bin" + "Line.txt.bin" + "22.txt.bin" + "Line.txt.bin" + "33.txt.bin" + "Line.txt.bin" + "44.txt.bin" + "Line.txt.bin" "! merged.bin"
pause

А как это можно записать без ввода file1 file2 ? Чтобы он сам парсил имена
например типа такого: (помесь vba и cmd)
Set Source=%CD%
Set Output=%CD%
Set Line=C:\0D0A.txt
for i = 1 to files.count
copy /b "%Output%\! merged.bin" + "%Line%" + "%Source%\file(i)" to "%Output%\! merged.bin"
next i
Или что-то типа такого полностью на %CD%

for i = 1 to files.count
if file(i) <> "! merged.bin" and file(i) <> "! 0D0A.bin"
copy /b "! merged.bin" + "! 0D0A.bin" + "file(i)" to "! merged.bin"
end if
next i
Тестовые файлы прикрепил

copy /b *.* "! merged.bin"
ну и не стоит забывать, что Dir имеет проблемы при составлении списка файлов
т.е. не поддерживает unicode в имени файла
хотя сейчас проверил, "●●●●.bin" клеится нормально. возможно список файлов в *.* формируется не через Dir() а через стороннюю функцию у которой нет проблем с не-православными именами файлов

megaloman
25-02-2022, 15:58
@Echo Off
cls
>nul Chcp 1251
Set "BoxIn=Z:\Box_In"
Set "Mask=bin*.bin"

Set "FileOut=Z:\Box_Out\! merged.bin"

If Not Exist "%BoxIn%\%Mask%" (Echo Files "%BoxIn%\%Mask%" not found &Pause &Exit /B)

FOR /F "usebackq delims=" %%f In (`2^>nul Where "%BoxIn%:%Mask%"`) DO >nul Copy /b "%%f" "%FileOut%" &GoTo :Begin
:Begin
FOR /F "usebackq Skip=1 delims=" %%f In (`2^>nul Where "%BoxIn%:%Mask%"`) DO (
(>>"%FileOut%" Echo.)
(>>"%FileOut%" Echo.)
>nul Copy /b "%FileOut%"+"%%f" "%FileOut%"
)
Pause
Exit /B

shadowbat
25-02-2022, 16:21
Echo »

Прекрасно работает
А как добавить исключение для добавления самого кода bat файла в результат? (копирую его в папку и запускаю из %CD%)
Ниже код с ошибкой:

@Echo Off
cls
>nul Chcp 1251
Set "BoxIn=%CD%"
Set "Mask=*.*"

Set "FileOut=%CD%\! merged.bin"

If Not Exist "%BoxIn%\%Mask%" (Echo Files "%BoxIn%\%Mask%" not found &Pause &Exit /B)

FOR /F "usebackq delims=" %%f In (`2^>nul Where "%BoxIn%:%Mask%"`) DO (IF "%%f" neq "binbin.bat"(>nul Copy /b "%%f" "%FileOut%" &GoTo :Begin))
:Begin
FOR /F "usebackq Skip=1 delims=" %%f In (`2^>nul Where "%BoxIn%:%Mask%"`) DO (IF "%%f" neq "binbin.bat" (
(>>"%FileOut%" Echo.)
(>>"%FileOut%" Echo.)
(Echo ------>>"%FileOut%")
(>>"%FileOut%" Echo.)
>nul Copy /b "%FileOut%"+"%%f" "%FileOut%"
))
Pause
Exit /B

megaloman
25-02-2022, 17:22
А как добавить исключение для добавления самого кода bat файла в результат? »111
1111
11


222
2222
22


333
3333
33

Если маской файла не удаётся отсечь батник и суммарный файл, то вот вариант с добавкой исключения из процесса батника и ! merged.bin@Echo Off
cls
>nul Chcp 1251
Set "BoxIn=%~dp0"
rem Set "BoxIn=Z:\Box_In"
Set "Mask=bin*.bin"

If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%"

rem Set "FileOut=Z:\Box_Out\! merged.bin"
Set "FileOut=%BoxIn%\! merged.bin"

If Not Exist "%BoxIn%\%Mask%" (Echo Files "%BoxIn%\%Mask%" not found &Pause &Exit /B)

FOR /F "usebackq delims=" %%f In (`2^>nul Where "%BoxIn%:%Mask%" ^|Find /I /V "%FileOut%" ^|Find /I /V "%~dpnx0"`) DO >nul Copy /b "%%f" "%FileOut%" &GoTo :Begin
:Begin
FOR /F "usebackq Skip=1 delims=" %%f In (`2^>nul Where "%BoxIn%:%Mask%" ^|Find /I /V "%FileOut%" ^|Find /I /V "%~dpnx0"`) DO (
(>>"%FileOut%" Echo.)
(>>"%FileOut%" Echo.)
>nul Copy /b "%FileOut%"+"%%f" "%FileOut%"
)
Pause
Exit /B
@Echo Off
cls
>nul Chcp 1251
If "%1"=="" (Echo Bat File "%~dpnx0" mast run with argument: folder path. Press any key. &>nul Pause &Exit /B)

Set "BoxIn=%1"
Set "Mask=bin*.bin"
rem Set "Mask=*.*"

If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%"

Set "FileOut=%BoxIn%\! merged.bin"

If Not Exist "%BoxIn%\%Mask%" (Echo Files "%BoxIn%\%Mask%" not found &Pause &Exit /B)

FOR /F "usebackq delims=" %%f In (`2^>nul Where "%BoxIn%:%Mask%" ^|Find /I /V "%FileOut%" ^|Find /I /V "%~nx0"`) DO >nul Copy /b "%%f" "%FileOut%" &GoTo :Begin
:Begin
FOR /F "usebackq Skip=1 delims=" %%f In (`2^>nul Where "%BoxIn%:%Mask%" ^|Find /I /V "%FileOut%" ^|Find /I /V "%~nx0"`) DO (
(>>"%FileOut%" Echo.)
(>>"%FileOut%" Echo.)
>nul Copy /b "%FileOut%"+"%%f" "%FileOut%"
)
Echo Press any key. &>nul Pause
Exit /B

shadowbat
25-02-2022, 18:13
Я не понял, что Вы хотите.
Допустим, сейчас результат кода ! merged.bin. Что в этом Вас не устраивает?»

Я всегда копирую батник в папку, с которой нужно работать
Это быстрее, чем прописывать вручную пути каждый раз.
В первом коде он естественно добавлял код этого батника в результат, что в принципе не критично.
Что хочу - скопировать батник в папку, получить сумму всех бинарников, кроме этого батника

вот вариант с добавкой исключения из процесса батника и ! merged.bin»
Второй вариант прекрасен, как раз то, что нужно.
Чуть изменил - с выводом имени файла + лог в консольку
@Echo Off
cls
>nul Chcp 1251
Set "BoxIn=%~dp0"
rem Set "BoxIn=Z:\Box_In"
Set "Mask=*.*"
If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%"
rem Set "FileOut=Z:\Box_Out\! merged.bin"
Set "FileOut=%BoxIn%\! merged.bin"
If Not Exist "%BoxIn%\%Mask%" (Echo Files "%BoxIn%\%Mask%" not found &Pause &Exit /B)
FOR /F "usebackq delims=" %%f In (`2^>nul Where "%BoxIn%:%Mask%" ^|Find /I /V "%FileOut%" ^|Find /I /V "%~dpnx0"`) DO (
Echo %%~nxf
Echo ---%%~nxf--->>"%FileOut%"
>>"%FileOut%" Echo.
>nul Copy /b "%FileOut%"+"%%f" "%FileOut%" &GoTo :Begin
)
:Begin
FOR /F "usebackq Skip=1 delims=" %%f In (`2^>nul Where "%BoxIn%:%Mask%" ^|Find /I /V "%FileOut%" ^|Find /I /V "%~dpnx0"`) DO (
Echo %%~nxf
>>"%FileOut%" Echo.
>>"%FileOut%" Echo.
Echo ---%%~nxf--->>"%FileOut%"
>>"%FileOut%" Echo.
>nul Copy /b "%FileOut%"+"%%f" "%FileOut%"
)
Pause
Exit /B



---11.txt.bin---

1111
11
11

---22.txt.bin---

2222
22
22

---33.txt.bin---

3333
33
33

---44.txt.bin---

4444
44
44

megaloman
25-02-2022, 18:43
В Вашем коде в первом случае в Copy "%%f" замените на "%FileOut%"+"%%f"




© OSzone.net 2001-2012