2015-11-08 7 views
3

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

После небольшого поиска я понял, что должен использовать findstr, чтобы перезаписать исходный файл новой версией, у которой было удалено определенное расширение (после того, как я напишу его в отфильтрованный файл).

for %%A in (*.*) do echo %%~xA >> initial.txt 
for /F %%B in (initial.txt) do (
    echo %%B >> filtered.txt 
    for /F %%C in (initial.txt) do findstr /v %%C initial.txt > initial.txt 
) 

но оставляет исходный файл пустой (как и ожидалось), а еще копирует каждую строку в файл filtered.txt. Я был бы очень рад за помощь.

ответ

6

Вы можете создать файл filtered.txt немедленно, нет необходимости в initial.txt:

> "filtered.txt" rem/ 
for %%A in ("*.*") do (
    > nul find /I "%%~xA" "filtered.txt" 
    if ErrorLevel 1 (
     >> "filtered.txt" echo %%~xA 
    ) 
) 

Здесь я использую find, а не findstr, потому что только простые символьные строки должны быть найдены. find (например, findstr) устанавливает ErrorLevel в 0, если встречается хотя бы одно совпадение, и до 1, если ни один не найден.

В зависимости от возвращаемого ErrorLevel, текущее итерированное расширение файла в %%~xA отражается и перенаправляется в filtered.txt или нет. Поэтому, если filtered.txt уже содержит текущий элемент, он не отражается, но если совпадение не встречается, элемент добавляется к файлу.

Первая строка создает пустой файл filtered.txt для find, чтобы не сбой для его первого выполнения.


Если вы хотите использовать файл initial.txt в любом случае, вы можете сделать следующее:

>> "initial.txt" (
    for %%A in ("*.*") do echo %%~xA 
) 
> "filtered.txt" rem/ 
for /F "usebackq eol=| delims=" %%A in ("initial.txt") do (
    > nul find /I "%%~xA" "filtered.txt" 
    if ErrorLevel 1 (
     >> "filtered.txt" echo %%~xA 
    ) 
) 

Этот код почти такой же, как и выше; единственными отличиями являются предшествующее создание initial.txt (потенциально содержащие дубликаты) и перечисление его содержимого (на for /F), а не перечисление текущего каталога напрямую.

+0

Спасибо! Первый пример выглядит как раз то, что мне нужно и сделано более эффективным способом. Я не понимал, что могу использовать errorlevels после команды find. Однако вы пропустили «x» в последней ссылке на переменную «A», которая заставила ее скопировать целые имена файлов вместо расширений. Я исправил это для себя, так что здесь нечего делать. Ценю вашу помощь! – iaureee

+0

Ах, спасибо за подсказку - я исправлю это через минуту ... – aschipfl

 Смежные вопросы

  • Нет связанных вопросов^_^