Ветеран
Сообщения: 27449
Благодарности: 8087
|
Профиль
|
Отправить PM
| Цитировать
Цитата Diamond:
Изначально создаваемый пакетный файл не использовал подставные символы т.е. каждое имя части указывалось точно(part1+part2+... и т.д.), но в этом случае может возникнуть ошибка из-за ограничения на длину строки в пакетном файле. Ещё у меня возникала мысль использовать цикл "For" (в пакетном файле) чтобы обойти это ограничение но я отказался от этой идеи.
|
Один-в-один , коллега. С тем исключением, что тот самый пример из справки («copy /b *.exe combin.exe ») я обошёл своим вниманием по вышеупомянутой причине.
Вы отказались, а я сделал как раз с «FOR /L», и результат оказался весьма удручающ (на больших объёмах/количествах частей время росло в геометрической прогрессии, хотя, конечно, можно было и тут несколько сократить время, используя слияние попарно, но я этого не стал делать).
Цитата:
Iska, У меня на FAT32 объединяются без проблем, на NTFS…
|
Вот пример, на котором будет отчётливо видна существующая разница в порядке слияния между FAT и NTFS (для этого копируемые файлы в примере создаются в порядке, отличном от нарастающего):
читать дальше »
Код: 
@echo off
md ".\Test"
cd ".\Test"
echo 03>03.txt
echo 02>02.txt
echo 01>01.txt
copy *.txt result.dat
type result.dat
del result.dat
del *.txt
cd ".."
rd ".\Test"
Такое может возникнуть, например, при переносе частей на флэшке с машины на машину в раздел FAT в случайном (не нарастающем) порядке.
В принципе, я думаю, что можно (и нужно) побороться и с FAT, например, предварительно сделав перенос отдельных частей в правильном порядке во временную папку (хотя бы тем же «FOR /L»), а затем уже безболезненно выполняя «copy /b *.parts …». Во всяком случае, я у себя именно так попробую и сделать, что-то наподобие:
Код: 
@echo off
setlocal enableextensions enabledelayedexpansion
md ".\Test"
cd ".\Test"
echo 03>03.txt
echo 02>02.txt
echo 01>01.txt
set strTempFolder=$temp%random%
md ".\%strTempFolder%"
for /l %%i in (1,1,99) do (
set number=00%%i
set strPartFile=!number:~-2!.txt
if exist "!strPartFile!" (
move "!strPartFile!" ".\%strTempFolder%\!strPartFile!">nul
)
)
copy /b ".\%strTempFolder%\*.txt" "result2.dat"
move ".\%strTempFolder%\*.txt" ".">nul
rd /s /q ".\%strTempFolder%"
echo [result2.dat] & type "result2.dat"
или, например, получая гарантированно отсортированный список файлов-частей посредством «dir /b /o:n ??.txt», или попросту задавая хранение списка частей в самом пакетном файле при его создании, и лишь потом делая шаманство «move в папку-combine-move назад».
В любом случае — отдельное спасибо: как бы то ни было, а Вы своим скриптом помогли мне осознать своё искреннее заблуждение в этом вопросе (что делать «copy /b *.parts …» всё-таки можно, выполнив предварительно некоторые телодвижения).
|
Отправлено: 21:48, 30-08-2009
| #13
|