我正在创建一个简单的* 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"
)
你知道发生了什么吗?
答案 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"
)