有人可以帮我写一个批处理脚本吗?我需要一个脚本,它可以删除文件名或目录中的最后一个单词和空格。
例如:
执行脚本New后的新文件夹- 删除最后一个空格和单词。
@ECHO OFF
SETLOCAL enabledelayedexpansion
FOR %%t IN (*) DO (
CALL :process "%%~nt"
IF DEFINED success ECHO REN "%%t" "!success!%%~xt"
)
GOTO :eof
:process
SET "success=%~1"
:procloop
SET "lastchar=%success:~-1%"
SET "success=%success:~0,-1%"
IF NOT DEFINED success GOTO :EOF
IF NOT "%lastchar%"==" " GOTO procloop
:: Remove any other trailing spaces
:rtsloop
SET "lastchar=%success:~-1%"
SET "success=%success:~0,-1%"
IF "%lastchar%"==" " GOTO rtsloop
SET "success=%success%%lastchar%"
GOTO :eof
对于大多数“正常”名称,这应该可以解决问题。对于包含很少字符的名称(如!
和^
-),它可能会失败,但这样的文件/目录名称很愚蠢。
将 更改FOR
为 aFOR /d
以处理目录,而不是文件。
本质上,NAME
...name 的一部分:process
在引号中传递给例程以保留其间距,并且例程首先删除最后一个字符,直到找到空格,然后继续删除任何其他空格。
如果名称没有空格,success
则为空,因此未定义,否则将具有新名称。
验证后,将ECHO REN
改为简单REN
地进行重命名,这个例程只是简单地报告它打算做什么。
附录:
我们有一个小小的术语难题。
对于FILES
,FILENAME.TXT
如果经常称为文件的“名称”,但是FILENAME
是“名称”并且.TXT
是EXTENSION。
当此过程发生时,期望的结果是FILENAME WITH SPACES.EXT
保留FILENAME WITH.EXT
文件的 EXTENSION 或 TYPE。
使用 DIRECTORY 名称,仍然支持“EXTENSION”的想法,因此Folder 18.9.0.17
被视为Folder 18.9.0
带有扩展名.17
(扩展名是 final 之后发生的任何内容.
)
解决方法很简单——不要在重命名中添加扩展名。
IF DEFINED success ECHO REN "%%t" "!success!"
(但请注意 , Folder 18.9.0.17
, Folder 18.9.0.18
ALL将Folder 18.9.0.19
在此处重命名目标- 只有第一个可能成功...)Folder
这应该工作ren *" "* *" "
。不过要小心,因为这将更改该目录中的所有内容。如果您知道文件或文件夹的第一个单词,那么您可以使用它ren 1stword" "* *" "
。