Пакетная замена всего после последнего символа подчеркивания в начале расширения файла - PullRequest
0 голосов
/ 31 марта 2020

Итак, я хочу заменить это:

Brand_Name_18.jpg

На это

Brand_Name_close-up.jpg

Я пытался

@echo off &setlocal
for /f "tokens=1-3*delims=_" %%i in ('dir /b /a-d *.jpg ^| find /i /v "_0_"') do ren "%%i_%%j" "%%i_%%j_0_"

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

Dir | rename-item -newname  { $_.Name + "_close-up }

.

get-childitem -recurse | rename-item -newname { $_.name -replace "_","_close-up" }

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

РЕШЕНИЕ благодаря T3RR0R

@echo off & Setlocal EnableDelayedExpansion
REM Change Directory and Remove /R recursive switch as / if necessary.
For /R %%A in (Brand_Name_*.jpg) do (
    REN %%~nxA Brand_Name_close-up.jpg
)
pause

1 Ответ

0 голосов
/ 31 марта 2020

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

@echo off & Setlocal EnableDelayedExpansion
Goto :Main

:ModString <string length> <string> <target substring> <prefix VarName> <Substring Length>
Set String=%2

For /L %%L in (%1,-1,1) do (
    Set Test=!String:~%%L,%5!
    If /I "!Test!"=="%3" (
        Set %4=!String:~0,%%L!
        Exit /B
    )
)
Set /P "prefix=%3 not found. Set prefix:"
Exit /B

:StrLen <resultVar> <string> 
(  
    Setlocal EnableDelayedExpansion
    (set^ tmp=%~2)

    If Defined tmp (
        Set "len=1"
        For %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) Do (
            If "!tmp:~%%P,1!" NEQ "" (
                Set /a "len+=%%P"
                Set "tmp=!tmp:~%%P!"
            )
        )
    ) else (
        Set "len=0"
    )
)
(
ENDLOCAL
Set "%~1=%len%"
exit /b
)

:Main
    Set /P "Searchfolder=< Drop & Drag or Enter Parent Folder:"
    IF Not Exist "!Searchfolder!" Goto :Main
    Set /P "Extension=Extension:"
    Set /P "SearchString=Enter String to Locate:"

For %%V in (Extension SearchString) do IF "!%%V!"=="" Goto :Main

For /R %%A in (*!SearchString!*.!Extension!) do (
    Call :StrLen substringLen "!SearchString!"
    Call :StrLen prefixLen "%%~nA"
    Call :ModString !prefixLen! %%~nA !SearchString! prefix !substringLen!
    Echo(Rename: %%~nxA
    Set /P "Newstring="
    REN %%~nxA !prefix!!SearchString!!Newstring!%%~xA
)

CHOICE /N /C ny /M "more N/Y?"
IF errorlevel 2 (
    Set Extension=
    Set Searchstring=
    Goto :main
)
exit

Обновление с единственное известное в вашем использовании то, что подчеркивание является последним экземпляром в имени / строке, которое вы хотите sh сохранить в новом имени файла, необходимо изменить функцию, чтобы найти свою позицию в строке, используя функцию длины строки чтобы изменить строку с этой точки, используя Substring Modification.

Функция StrLen - это работа Jeb

Я изменил код, чтобы теперь занять немного больше ввода и быть более гибким. Теперь вы можете использовать его с другими расширениями и определить строку для поиска во время выполнения.

...