Пакетно - Обратный / Отрицательный цикл FOR? - PullRequest
1 голос
/ 09 мая 2011

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

Первый файл будет объединением всех других файлов с "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 (внизу) не 'Я не хочу играть хорошо, используя «not» и восклицательный знак, подобный этому ...

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

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

Ответы [ 3 ]

0 голосов
/ 09 мая 2011

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

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

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

0 голосов
/ 10 мая 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=), чтобы учесть пробелы в именах файлов.

0 голосов
/ 09 мая 2011

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

Вероятно, вы можете использовать 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
)
...