Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] вставить две пустых строки в copy bin (http://forum.oszone.net/showthread.php?t=350771)

shadowbat 24-02-2022 16:30 2980751

вставить две пустых строки в copy bin
 
Есть код
Код:

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 2980754

перефразируете замысел!

shadowbat 24-02-2022 18:56 2980755

как сделать бинарный объединятор 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


Serguei Kouzmine 25-02-2022 03:09 2980778

создайте файл file0 c содержимым 0D0A0D0A любым доступным вам способом и задача сведется к
copy /b file1 file0 file2 file0 file3 file0 .... "! merged.bin"

shadowbat 25-02-2022 06:14 2980781

Вложений: 1
Цитата:

Цитата Serguei Kouzmine
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 2980797

Код:

@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 2980799

Цитата:

Цитата megaloman
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 2980802

Цитата:

Цитата shadowbat
А как добавить исключение для добавления самого кода bat файла в результат? »

Я не понял, что Вы хотите.
Допустим, сейчас результат кода ! merged.bin. Что в этом Вас не устраивает?
Код:

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 2980805

Цитата:

Цитата megaloman
Я не понял, что Вы хотите.
Допустим, сейчас результат кода ! merged.bin. Что в этом Вас не устраивает?»

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

Цитата:

Цитата megaloman
вот вариант с добавкой исключения из процесса батника и ! 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 2980806

В Вашем коде в первом случае в Copy "%%f" замените на "%FileOut%"+"%%f"


Время: 14:21.

Время: 14:21.
© OSzone.net 2001-