-1

Был бы признателен, если кто-нибудь может помочь мне с этим запросом.

Мне нужен динамический пакетный скрипт, который может выполнить следующую команду для ЛЮБОГО числа файлов:

Copy 1.txt + 2.txt + 3.txt + 4.txt newfile.txt

Если у меня есть следующие файлы:

1.txt

2.txt

3.txt

...скоро

И я пытаюсь: Copy *.txt newfile.txt Он не сортируется правильно при объединении. На самом деле это заканчивается: Copy 3.txt + 4.txt + 2.txt + 1.txt newfile.txt

Кроме того, мне нужно использовать команду копирования, а не команду типа.

Я не мог найти правильный способ сделать это, так как большинство примеров циклов FOR онлайн используют TYPE, и это не подходит для того, чего я пытаюсь достичь.

Ваша помощь очень ценится!

1 ответ1

1

Я не могу поверить, что copy изменила бы порядок сортировки объединенных файлов. Однако следующий скрипт self_explaining может помочь:

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion

pushd d:\bat\files\folder

REM echo(&echo SHOW files to be merged in different sort order 
REM erase newfile.txt 2>NUL
REM @ECHO ON
REM @for %%G in (
REM   "/-C" "/O:N" "/O:S" "/O:E" "/O:D /T:C" "/O:D /T:W"
REM   ) do dir %%~G *.txt|findstr "\.txt$"
REM @ECHO OFF

echo(&echo RESULT: copy *.txt newfile.txt
erase newfile.txt 2>NUL
rem (optional): to throw away trailing `Ctrl+Z`, use `/B` switch as follows:
rem copy /Y *.txt newfile.txt /B  
@ECHO ON
copy /Y *.txt newfile.txt
findstr "^" *.txt
@ECHO OFF

echo(&echo(&echo RESULT: merge *.txt in defined order: change `/O` switch
echo(
type nul> newfile.txt
set /A "_files=0"
for /F "delims=" %%G in ('
  dir /B /O:N *.txt
  ') do @if not "%%G"=="newfile.txt" (
            echo(%%~G
            set /A "_files+=1"
            copy /Y newfile.txt + %%~G newfile.txt /B >NUL
        )
echo       %_files% file^(s^) merged.
rem (optional): to add trailing `Ctrl+Z`, remove `REM` in next line  
REM copy newfile.txt + NUL newfile.txt >NUL
@ECHO ON
findstr "^" *.txt
@ECHO OFF
popd

Обратите внимание, что фрагмент кода с REM комментариями, следующий за командой pushd , покажет файлы, которые будут объединены в другом порядке сортировки, если они не закомментированы (все 7 REM удалены). Я держу это здесь для целей отладки.

Результат:

==> D:\bat\SU\1002948.bat

RESULT: copy *.txt newfile.txt

==> copy /Y *.txt newfile.txt
1.txt
2.txt
3.txt
4.txt
        1 file(s) copied.

==> findstr "^" *.txt
1.txt:1111
2.txt:2
3.txt:333
4.txt:44
newfile.txt:1111
newfile.txt:2
newfile.txt:333
newfile.txt:44
newfile.txt:→

RESULT: merge *.txt in defined order: change `/O` switch

1.txt
2.txt
3.txt
4.txt
      4 file(s) merged.

==> findstr "^" *.txt
1.txt:1111
2.txt:2
3.txt:333
4.txt:44
newfile.txt:1111
newfile.txt:2
newfile.txt:333
newfile.txt:44

==>

Здесь символ трейлинг стрелка вправо в newfile.txt представляет EOF (конец файла, шестнадцатеричный 0x1A), т.е. Ctrl+Z.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .