Пакетный файл, чтобы найти файлы с двойными расширениями и удалить последний

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

Here's an example

C:\test\regular.exe
C:\test\picture.jpg.doc
C:\newtest\document.doc.pdf

End Result I need

C:\test\regular.exe
C:\test\picture.jpg
C:\newtest\document.doc

2 ответа

Решение
@ECHO OFF
SETLOCAL

SET sourcedir=c:\sourcedir
FOR /r "%sourcedir%" %%i IN (*.*) DO (
 FOR %%n IN ("%%~ni") DO IF NOT "%%~xn"=="" IF NOT EXIST "%%~dpni" ECHO REN "%%~fi" "%%~ni"
 FOR %%n IN ("%%~ni") DO IF NOT "%%~xn"=="" IF EXIST "%%~dpni" ECHO CAN NOT REN "%%~fi" "%%~ni"
)

GOTO :EOF

Эта партия должна выполнить задачу.

Для каждого файла в дереве с корнем в sourcedirесли NAME самого файла содержит "расширение", а имя файла без исходного расширения не существует, затем переименуйте файл. Таким образом, если ...picture.jpg.doc найдено, переименование должно произойти только если ...picture.jpg не существует.

Команда переименовать просто ECHOредактор Вам нужно будет удалить ECHO Ключевое слово для активации переименования - после проверки, что вы хотите сделать.

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


Пересмотрено, чтобы изменить имя в случае, если простое переименование не может быть сделано.

Осторожно - эта версия будет сразу переименована - нет ECHOЕсли вы сначала предоставляете список, потому что бессмысленно предоставлять такой список при переименовании файла, это может привести к разным результатам при главном запуске переименования.

@ECHO OFF
SETLOCAL

SET sourcedir=c:\sourcedir
FOR /r "%sourcedir%" %%i IN (*.*) DO (
 FOR %%n IN ("%%~ni") DO IF NOT "%%~xn"=="" IF EXIST "%%~dpni" (
  SET renreq=Y
  FOR %%a IN (new alt extra another 1 2 3 4 5 6 7 8 9) DO IF DEFINED renreq (
   IF NOT EXIST "%%~dpi%%~nn_%%a%%~xn" (
    REN "%%~fi" "%%~nn_%%a%%~xn"
    SET "renreq="
   )
  )
  IF DEFINED renreq ECHO CAN NOT REN "%%~fi"
 ) ELSE (
 REN "%%~fi" "%%~ni"
 )
)

GOTO :EOF

Разумно очевидно, что список "дополнений" может быть расширен при необходимости.

Попробуйте это и удалите echo, если вывод в порядке:

@echo off &setlocal
for /r \ %%i in (*) do (
    for %%j in ("%%~ni") do if "%%~xj" neq "" echo ren "%%~fi" "%%~nj"
)

Редактировать: добавлена ​​поддержка всего HD.

Другие вопросы по тегам