删除批处理中每个文件夹名称的一部分

时间:2014-08-04 22:16:46

标签: batch-file for-loop scripting

我正在尝试遍历“source”下的每个文件夹,并删除我添加的版本扩展名。

例如,

\pathTo\source\FirstComponent.1.5\...
\pathTo\source\SecondComponent.4.6\...

更改为,

\pathTo\source\FirstComponent\...

这是我到目前为止所拥有的......

SETLOCAL
set "SourceDir=C:\pathTo\source"
FOR /d %%i IN ("%SourceDir%") DO FOR /f "delims=." %%j IN ("%%i") DO REN "%%~i" "%%~j%%~xi"

2 个答案:

答案 0 :(得分:2)

foxidrive已经找到了正确的帮助来找到解决方案。

@echo off
set "SourceDir=C:\pathTo\source"
FOR /d %%i IN ("%SourceDir%\*") DO FOR /f "delims=." %%j IN ("%%i") DO REN "%%~i" "%%~nj"
set SourceDir=
删除文件夹的路径并获取没有路径的文件夹的新名称时,需要

%%~nj而不是%%j

也可能按照Andriy M

的建议进行操作
@echo off
set "SourceDir=C:\pathTo\source"
FOR /d %%i IN ("%SourceDir%\*") DO FOR /f "delims=." %%j IN ("%%~ni") DO REN "%%~i" "%%j"
set SourceDir=

如果其中一个父文件夹在名称中也包含一个点,那就更好了。

但如果所有文件夹在必须保留的版本字符串之前在名称Component.One中有一个点,则可以使用以下批处理代码:

@echo off
set "SourceDir=C:\pathTo\source"
FOR /d %%i IN ("%SourceDir%\*") DO FOR /f "tokens=1,2* delims=." %%j IN ("%%~ni") DO REN "%%~i" "%%j.%%k"
set SourceDir=

还有一个解决方案可以删除文件夹名称中的最后4个字符,如果最后一个字符是第三个字符:

@echo off
setlocal EnableDelayedExpansion
set "SourceDir=C:\pathTo\source"
FOR /d %%i IN ("%SourceDir%\*") DO (
   set "FolderName=%%~nxi"
   if "!FolderName:~-4,1!"=="." REN "%%~i" "!FolderName:~0,-4!"
)
endlocal

答案 1 :(得分:1)

如果您需要修复的文件夹名称始终采用此格式

name.number.number

您需要删除.number.number部分,您也可以使用此方法:

SETLOCAL
SET "SourceDir=C:\pathTo\source"
FOR /D %%I IN ("%SourceDir%") DO (
  FOR %%J IN ("%%~nI") DO RENAME "%%~I" "%%~nJ"
)

基本上,我们的想法是将版本号视为名称扩展名。内部循环使用%%~nI表达式仅获取没有扩展名的文件夹名称,即没有最后.number,并将结果分配给%%J。以类似的方式,RENAME命令使用%%~nJ来删除剩余的.number(原始名称中的第一个)。因此,使用FirstComponent.1.5名称作为示例,RENAME命令基本上就像这样:

RENAME "...\FirstComponent.1.5" "FirstComponent"

由于该方法基本上只删除了最后两个扩展名,因此您可以使用大版本号:10.1232014.12 ...该方法的唯一限制是版本号必须始终包含正好两部分。 (如果不允许你的名字有.,它还可以支持单部分版本号。)