剥离非字母数字字符的文件名

时间:2015-11-24 19:02:47

标签: regex windows batch-file command-line wildcard

如何将文件重命名为除了字母和数字之外的所有其他字符的文件名?

例如:

它的品牌(新)#年,2016年!.txt 重命名为 ItsABrandNewYear2016.txt

是否可以使用Windows批处理执行此操作?

3 个答案:

答案 0 :(得分:3)

将下面的代码保存为批处理文件(扩展名为.BAT):

@if (@CodeSection == @Batch) @then

@echo off
setlocal

set "oldname=It's_A Brand (New) #Year,,2016!.txt"
for %%f in ("%oldname%") do (
   for /F %%a in ('cscript //nologo //E:JScript "%~F0" "%%~Nf"') do ECHO ren "%%~f" "%%a%%~Xf"
)
goto :EOF


@end

// JScript section

WScript.Stdout.WriteLine(WScript.Arguments(0).replace(/[\W_]/g,""));

输出:

ren "It's_A Brand (New) #Year,,2016!.txt" "ItsABrandNewYear2016.txt"

答案 1 :(得分:1)

@ECHO OFF
SETLOCAL
set "filename=It's_A Br@$^[-+={;}]a.nd & (New) #Year,,2016!.txt"
SET "newname="
FOR %%a IN ("%filename%") DO CALL :strip "%%~na" "%%~xa"
ECHO RENAME "%filename%" to "%newname%"

GOTO :EOF

:strip
SET "string=%~1"
IF NOT DEFINED string SET "newname=%newname:~0,-1%"&GOTO :EOF
:striploop
SET "char=%string:~0,1%"
ECHO "%char%"|FINDSTR /i /r "[a-z] [0-9]" >NUL
IF NOT ERRORLEVEL 1 SET "newname=%newname%%char%"
SET "string=%string:~1%"
IF DEFINED string GOTO striploop
SHIFT
SET "newname=%newname%."
GOTO strip

合理直截了当。请注意,只保留名称中的最后一个点(如果有)。

答案 2 :(得分:1)

我编写了一个名为JREN.BAT的混合批处理/ JScript实用程序,它直接从命令行提供正则表达式重命名,无需任何其他脚本。它是纯脚本,可​​以在XP以后的任何Windows机器上本机运行。

解决方案类似于Aacini,除了将find / replace应用于整个名称,因此正则表达式必须更加复杂以保留扩展点。

jren "[^a-z0-9.]|\.(?!txt$)" "" /i /fm "It's_A Brand (New) #Year,,2016!.txt"

除了保留扩展点之外,可以轻松地从当前目录中的所有文件名中删除所有非字母数字字符的解决方案。

jren "[^a-z0-9.]|\.(?![^.]+$)" "" /i

请注意,JREN是一个批处理脚本,因此如果您在另一个批处理脚本中使用该命令,则必须使用call jren