0

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

执行脚本New后的新文件夹- 删除最后一个空格和单词。

4

2 回答 2

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

本质上,NAME...name 的一部分:process在引号中传递给例程以保留其间距,并且例程首先删除最后一个字符,直到找到空格,然后继续删除任何其他空格。

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

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


附录:

我们有一个小小的术语难题。

对于FILESFILENAME.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.18ALLFolder 18.9.0.19在此处重命名目标- 只有第一个可能成功...)Folder

于 2013-03-26T11:24:14.767 回答
0

这应该工作ren *" "* *" "。不过要小心,因为这将更改该目录中的所有内容。如果您知道文件或文件夹的第一个单词,那么您可以使用它ren 1stword" "* *" "

于 2013-03-26T10:58:57.753 回答