Пакетный скрипт, чтобы сохранить только последнюю часть имени файла и его расширение - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть папка, которая содержит несколько файлов в этом формате: enter image description here

Я хотел бы переименовать все эти файлы, чтобы я получил: 391047.png, 416945. pdf, 416946.pdf, ..., 437703.png

Я могу sh сделать это с помощью пакета cmd

Если кто-то может мне помочь с этим, я действительно не знаком с пакетными командами!

Заранее спасибо

Ответы [ 4 ]

3 голосов
/ 26 февраля 2020

Без полной детализации вашего вопроса, я могу догадаться, что вы хотите получить последнюю часть имени файла, разделенную дефисом, и переименовать его в это имя. Если вывод на экране выглядит правильно, удалите ECHO, предшествующий команде REN.

@ECHO OFF
SETLOCAL
REM Capture output of DIR, don't grab batch file and call the rename subroutine
FOR /F "delims=" %%G IN ('DIR /a-d /b *.* ^|findstr /V "%~nx0"') DO CALL :RENAME "%%~G"
pause
ENDLOCAL
REM This terminates the batch file
GOTO :EOF

REM Functions below.
:RENAME
REM assign passed argument to a variable
set "file=%~nx1"
REM Get last part of file name based on hyphen as delimiter
set "last=%file:-=" & set "last=%"
REM rename passed file to last part of file name
echo ren "%~1" "%last%"
REM ends the subroutine
GOTO :EOF
1 голос
/ 27 февраля 2020

Как насчет еще одного пути? Это самое большое предположение, что перед цифрами, предшествующими расширению, стоит ГИФЕН-МИНУС. Если вы уверены, что переименование будет выполнено правильно, удалите -WhatIf из команды Rename-Item.

powershell -NoLogo -NoProfile -Command ^
    "Get-ChildItem -File -Path 'C:\src\t\last4' |" ^
        "ForEach-Object {" ^
            "if ($_.Name -match '.*-(\d*\..*)$') {" ^
                "Rename-Item -Path $_.FullName -NewName $Matches[1] -WhatIf" ^
            "}" ^
        "}"

Естественно, это было бы проще и понятнее, если бы оно было написано как скрипт PowerShell.

Get-ChildItem -File -Path 'C:\src\t\last4' |
    ForEach-Object {
        if ($_.Name -match '.*-(\d*\..*)$') {
            Rename-Item -Path $_.FullName -NewName $Matches[1] -WhatIf
        }
    }
1 голос
/ 27 февраля 2020

И просто для чего-то, немного отличающегося от других существующих ответов:

@Set "MyDir=C:\Users\Tibo\Desktop\MyDirectory"
@For /F "EOL=|Delims=" %%G In ('Dir /B/A-D-S "%MyDir%\*-*" 2^>NUL')Do @(
    Set "BaseName=%%~nG"&SetLocal EnableDelayedExpansion
    For %%H In ("!BaseName:-=\!")Do @EndLocal&Ren "%MyDir%\%%G" "%%~nxH%%~xG")

В этом списке перечислены все системные файлы, отсутствующие в %MyDir%, (которые вы должны изменить, чтобы они соответствовали вашим фактическим location) , имя которого содержит хотя бы один дефис, -. Затем он заменяет все дефисы в базовых именах файла обратным символом sh и переименовывает оригинал, используя деталь после последней \. Это достигается путем реализации ~nx, (чтобы разрешить такие имена, как 2002-006-Moi-105472.5.jpg) и добавляет расширение ~x обратно. Сценарий использует отложенное расширение, поскольку он создает и использует переменную в одном и том же блоке кода.

1 голос
/ 26 февраля 2020

Если вы работаете в той же папке, что и ваши файлы, если нет, отредактируйте:

cd/d "%~dp0" ==> <b><i>cd/d "d:\your\folder"</b></i>

Для этой задачи, если все имена ваших файлов заканчиваются ровно 6 цифрами / символами, и вам нужно сделать это в любой подпапке, попробуйте for l oop, используя where.exe:

@echo off 
cd/d "%~dp0"
for /f tokens^=* %%i in ('%__APPDIR__%where.exe /r . *^| %__APPDIR__%findstr.exe /v "bat  cmd"
')do set "_file=%%~ni" && cmd/v/c echo/ ren "%%~fi" "!_file:~-6!%~xi"
  • Или в командной строке:
@cd/d "d:\your\folder" & @for /f tokens^=* %i in ('%__APPDIR__%where.exe /r . *^| %__APPDIR__%findstr.exe /v "bat  cmd"')do @set "_file=%~ni" && cmd/v/c @echo/ ren "%~fi" "!_file:~-6!%~xi"

Подробнее о Where.exe и некоторые примеры здесь

...