重命名文件名中包含空格和点的文件

时间:2013-05-23 11:34:54

标签: windows batch-file cmd

我正在创建一个简单的* bat文件,具有拖放功能,可替换下划线(_)的空格()和点(。)。

我认为这应该有效,但事实并非如此:

@ECHO OFF
setlocal enabledelayedexpansion
FOR %%f IN (%*) DO (
set filename=%%~nj
set filename=!filename:.=_!
set filename=!filename: =_!
if not "!filename!"=="%%~nf" RENAME "%%f" "!filename!%%~xf"
)

你知道发生了什么吗?

2 个答案:

答案 0 :(得分:2)

试试这个:

@ECHO OFF &setlocal

FOR %%f IN (%*) DO (
set "oldname=%%~ff"
set "oldfname=%%~nf"
set "extension=%%~xf"
setlocal enabledelayedexpansion
set "filename=!oldfname:.=_!"
set "filename=!filename: =_!"
if not "!filename!"=="!oldfname!" RENAME "!oldname!" "!filename!!extension!"
endlocal
)

set的赋值放在双引号中以保护代码免受丑陋字符的影响。稍后在for循环中设置delayed expansion以在文件名中保存感叹号和插入符号。

答案 1 :(得分:0)

您的循环变量为%%f,但在第一行中,您将filename分配给%%j

您的代码应如下所示:

@ECHO OFF
setlocal enabledelayedexpansion
FOR %%f IN (%*) DO (

rem corrected-begin
set filename=%%~nf
rem corrected-end

set filename=!filename:.=_!
set filename=!filename: =_!
if not "!filename!"=="%%~nf" RENAME "%%f" "!filename!%%~xf"
)

此外,您可能希望确保始终删除最终引号。也就是说,循环的最后一行应为:

if not "!filename!"=="%%~nf" RENAME "%%~f" "!filename!%%~xf"

然后,您不应该禁止正在移动的文件的目录部分。

if not "!filename!"=="%%~nf" RENAME "%%~dpnxf" "!filename!%%~xf"

在让代码松散之前,您可能希望用以下内容替换最后一行:

if not "!filename!"=="%%~nf" ECHO RENAME "%%~f" "!filename!%%~xf" >> "%TEMP%\test.txt"

然后,在你的拖放操作之后检查“%TEMP%\ test.txt”以查看它是否包含操作,以及文件上的预期。

供参考,以下是所有更改后的完整文件:

@ECHO OFF
setlocal enabledelayedexpansion
FOR %%f IN (%*) DO (
    set filename=%%~nf
    set filename=!filename:.=_!
    set filename=!filename: =_!
    rem uncomment  for debugging.
    rem if not "!filename!"=="%%~nf" ECHO RENAME "%%~dpnxf" "!filename!%%~xf" >>     "%TEMP%\test.txt"
    rem comment for debugging.
    if not "!filename!"=="%%~nf" RENAME "%%~dpnxf" "!filename!%%~xf"
)