替换空间和。在带有下划线的文件名中

时间:2017-08-19 21:19:37

标签: windows batch-file command-line

我按照https://stackoverflow.com/a/16129486/2000557的示例修改了视频文件文件夹的脚本。

@echo off
Setlocal enabledelayedexpansion

Set "Pattern=."
Set "Replace=_"

For %%a in (*.avi) Do (
Set "File=%%~a"
Ren "%%a" "!File:%Pattern%=%Replace%!"
)

For %%a in (*.mkv) Do (
Set "File=%%~a"
Ren "%%a" "!File:%Pattern%=%Replace%!"
)

For %%a in (*.mp4) Do (
Set "File=%%~a"
Ren "%%a" "!File:%Pattern%=%Replace%!"
)

Pause&Exit

任何人都可以解释为什么这也将文件名中的最后一个点(也就是扩展的一部分)替换为下划线。这感觉就像我被给了鱼而没有教过如何钓鱼。这个剧本有效,但遗憾的是它也取代了最后一个时期 我想在不必打开隐藏扩展的情况下使用该脚本。

2 个答案:

答案 0 :(得分:1)

替换是整体的,不能受到限制。

解决方法很简单,只需使用不带文件扩展名的名称并附加原始扩展名 - 这样只需要一个(对于每个替换)。

@echo off & Setlocal EnableDelayedExpansion
For %%A in ("*.*.avi" "*.*.mkv" "*.*.mp4") Do (
    Set "File=%%~nA"
    Ren "%%A" "!File:.=_!%%~xA" 2>NUL
)

For %%A in ("* *.avi" "* *.mkv" "* *.mp4") Do (
    Set "File=%%~nA"
    Ren "%%A" "!File: =_!%%~xA" 2>NUL
)

或者这个版本

For %%A in (*.avi *.mkv *.mp4) Do (
    Set "File=%%~nA"
    Set "File=!File: =_!"
    Set "File=!File:.=_!"
    If "%%~nA" neq "!File!" Ren "%%A" "!File!%%~xA"
)

我不是更有效率的舒尔。

答案 1 :(得分:0)

您可以尝试使用此批处理脚本:

@echo off
Setlocal enabledelayedexpansion
Set "FileType=avi mp4 mkv"
Call :Search_Replace " " "." "!FileType!"
Call :Search_Replace "." "_" "!FileType!"
Timeout -1 & exit
::********************************************************
:Search_Replace <Pattern> <Replace> <FileType>
Set "Pattern=%~1"
Set "Replace=%~2"
@For %%# in (%~3) do (
    For %%a in (*.%%#) Do (
        Set "File=%%~na"
            ren "%%a" "!File:%Pattern%=%Replace%!%%~xa"
    )
)
Exit /b
::********************************************************