批处理脚本删除文件名或目录中的最后一个单词

时间:2013-03-26 10:34:34

标签: batch-file

有人可以帮助我使用批处理脚本。我需要一个脚本,可以删除文件名或目录中的最后一个单词和空格 例如:

执行脚本后

新文件夹 - 删除最后一个空格和单词。

2 个答案:

答案 0 :(得分:0)

这应该有效ren *" "* *" "。但要小心,因为这将改变该目录中的所有内容。如果您知道文件或文件夹的第一个单词,则可以使用此ren 1stword" "* *" "

答案 1 :(得分:0)

@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更改为FOR /d以处理目录,而不是文件。

本质上,...名称的NAME部分用引号传递给:process例程以保持其间距,例程首先从最终字符中删除,直到找到空格为止,然后继续删除任何其他空格。

如果名称没有空格,success将为空,因此未定义,否则它将具有新名称。

验证后,将ECHO REN更改为简单REN进行重命名,此例程只是报告它打算做什么。


附录:

我们有一点术语难题。

对于FILESFILENAME.TXT如果经常被称为文件的“名称”,但FILENAME是“名称”而.TXT是EXTENSION。

当此过程发生时,所需的结果是FILENAME WITH SPACES.EXT变为FILENAME WITH.EXT以保留文件的EXTENSION或TYPE。

使用DIRECTORY名称,仍然支持“扩展”的概念,因此Folder 18.9.0.17被视为Folder 18.9.0,扩展名为.17(扩展名是在最终版本之后发生的任何内容) .

治愈很简单 - 不要在重命名中添加扩展名。

  IF DEFINED success ECHO REN "%%t" "!success!"

(但请注意,Folder 18.9.0.17Folder 18.9.0.18Folder 18.9.0.19 ALL 的目标重命名为Folder - 只有第一个可能成功...)