Пакет - обратные/отрицательные циклы FOR?

Я пытаюсь объединить много файлов в два отдельных файла.

Первый файл будет конкатенацией всех остальных файлов с "bob" в имени файла. Второй файл будет конкатенацией всех файлов БЕЗ "bob" в имени файла. Оба файла будут выводить имя файла до фактического выполнения конкатенации.

Вот что у меня есть до сих пор:

            @echo off
            setlocal EnableDelayedExpansion
            set bob=All_bob.txt
            set jimmy=All_jimmy.txt

            if exist %bob% del %bob%
            if exist %jimmy% del %jimmy%

            for %%a in (*bob*.txt) do (
            echo /* >>%bob%
            echo * %%a >>%bob%
            echo */ >>%bob%
            copy/b %bob%+"%%a" %bob%
            echo. >>%bob%
            echo. >>%bob%)


            for %%a not in (*bob*.txt) do (
            echo /* >>%jimmy%
            echo * %%a >>%jimmy%
            echo */ >>%jimmy%
            copy/b %jimmy%+"%%a" %jimmy%
            echo. >>%jimmy%
            echo. >>%jimmy%)

Однако второй цикл FOR (внизу) не хочет играть красиво, используя «не» и используя восклицательный знак, подобный этому...

            for %%a !(*bob*.txt) do (

... тоже не хочет работать. Итак, как мне объединить файлы, которые НЕ содержат то, что находится внутри скобок?


person rahlzel    schedule 09.05.2011    source источник


Ответы (3)


Я не думаю, что есть чистое решение для этого.

Вероятно, вы могли бы использовать FINDSTR для фильтрации %%a, но это потребовало бы превращения *bob*.txt в регулярное выражение, и это, вероятно, нелегко автоматизировать.

Другим (уродливым) решением является использование вложенных циклов:

echo bob:
for %%a in (*bob*.txt) do (
    echo %%a
)

echo not bob:
for %%a in (*) do (
    setlocal ENABLEDELAYEDEXPANSION&set inc=1
    for %%b in (*bob*.txt) do if "%%~a"=="%%~b" set inc=0
    if "!inc!"=="1" echo %%a
    endlocal
)
person Anders    schedule 09.05.2011

Как насчет использования find:

for /F %%a in ('dir /b *.txt') do (
echo %%a | find /V "bob")

Это должно вернуть все файлы .txt, в которых нет «bob».

person likso    schedule 09.05.2011
comment
Это прекрасно работает для этого конкретного примера, но что, если строка поиска foobarbaz.txt или b?b.txt - person Anders; 10.05.2011
comment
@ Андерс, likso отвечает на вопрос ОП. - person PA.; 10.05.2011

Используя findstr и регулярное выражение для *bob*.txt:

for /f "usebackq delims=" %%a in (`dir /b ^| findstr ".*bob.*\.txt"`) do (…)

Просто используйте переключатель /V для обработки всех остальных файлов:

for /f "usebackq delims=" %%a in (`dir /b ^| findstr /v ".*bob.*\.txt"`) do (…)

Вы можете использовать команду help или переключатель /? для for или findstr для получения дополнительной информации.
Я очистил разделители (delims=), чтобы разрешить пробелы в именах файлов.

person mousio    schedule 10.05.2011
comment
Просто используйте шаблоны foo.*bar.*baz\.txt или b.b\.txt для соответствия поиску файлов foo*bar*baz.txt или b?b.txt :] - person mousio; 10.05.2011