Переименуйте файлы с пакетным файлом, если в имени файла отсутствует строка

Я пытаюсь написать пакетный файл, который переименовывает имена файлов, если имя файла не содержит определенной строки в конце. Например, у меня есть папка, содержащая следующие файлы:

Тестовый файл1.csv
Тестовый файл2 Zac.csv

Для каждого файла, который не содержит «Zac» (без кавычек) в конце (перед расширением), я хочу добавить «Zac» к имени файла. Таким образом, результатом будет:

Тестовый файл1 Zac.csv
Тестовый файл2 Zac.csv

Это то, что у меня сейчас есть для пакетного файла:

for %%f in (*.csv) do (ren "%%f" ???????????????????????????????" Zac.csv"

Но это добавит «Zac» ко всем файлам, даже если они уже содержат «Zac». Как я могу изменить только те файлы, у которых нет «Zac» в конце?

Большое спасибо!


person Zachary    schedule 26.09.2013    source источник


Ответы (3)


    for /f "delims=" %%a in ('dir /b /a-d *.csv ^|findstr /iv "zac"') do echo ren "%%~a" "%%~na Zac%%~xa"

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

person Endoro    schedule 26.09.2013
comment
Спасибо, @Эндоро! Похоже, он отлично работает. Я смог следовать большей части сценария. Всего пара вопросов: что означает ^| сделать для команды FINDSTR? А \iv означает «без учета регистра» и «печатать только строки без совпадений», верно? - person Zachary; 27.09.2013
comment
Термин поиска действительно должен быть /ivr "zac....$", если термин также находится в другом месте в имени файла. Однако это не проблема для ОП ... И просто добавив здесь: ^| - это экранированный канал, который такой же, как обычный канал, но в команде for-in-do некоторые символы необходимо экранировать. - person foxidrive; 27.09.2013

Это должно работать:

@echo off
: create variable to track number of files renamed
set filesRenamed=0
: loop through csv files and call Rename routine
for %%f in (*.csv) do call :Rename "%%f" filesRenamed
: output results
echo %filesRenamed% files renamed
: clear variables
set filesRenamed=
set tmpVar=
: Goto end of file so we don't call rename an extra time
goto :eof

:Rename
: need a local environment variable with filename for manipulation
set tmpVar=%1
: remove the closing quotes
set tmpVar=%tmpVar:~0,-1%
: compare the last 8 characters and rename as necessary
if /I NOT "%tmpVar:~-8%" EQU " Zac.csv" (
    : use original file name parameter which is already quoted
    ren %1 ???????????????????????????????" Zac.csv"
    : increment the renamed file count
    set /A %2=%2+1
)

См. этот другой пост за хорошее описание обработки подстрок в пакетных файлах.

person DSway    schedule 26.09.2013

используя renamer, эти входные файлы:

Test File1 Zac.csv
Test File2.csv
Test File3.csv
Test File4.xls
Test File5 Zac.csv

с помощью этой команды:

$ renamer --regex --find '(Test File\d)(\.\w+)' --replace '$1 Zac$2'  *

приводит к этим новым именам файлов:

Test File1 Zac.csv
Test File2 Zac.csv
Test File3 Zac.csv
Test File4 Zac.xls
Test File5 Zac.csv

дайте мне знать, если вам нужна дополнительная помощь.

person Lloyd    schedule 27.09.2013