【问题标题】:Removing portion of each folder name in Batch批量删除每个文件夹名称的一部分
【发布时间】:2014-09-27 12:05:13
【问题描述】:

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

例如,

\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"

【问题讨论】:

  • 删除这个%%~xi并在REN前面加上一个回显,这样你就可以在提交之前先看到结果。
  • 文件夹名称末尾的版本字符串是否始终为 4 个字符?然后最好通过删除文件夹名称末尾的这 4 个字符来重命名文件夹,以防最后一个但第三个字符是点。

标签: batch-file for-loop scripting


【解决方案1】:

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

【讨论】:

  • 或者您可以在更早的时候使用~n... %%j IN ("%%~ni") DO REN "%%~i" "%%~j"
  • 问题是我的组件名有一个“.”在里面。所以该命令正在清除我的版本号。
  • Component.One.3.5 成为组件
  • 嗯,批处理代码(按原样)无法区分点是否属于人类解释为版本的字符串或用作两个单词之间的分隔符。您必须为文件夹名称中点的不同解释定义规则。
  • 我可以删除源文件夹中每个文件夹名称末尾的最后四个字符,而不是检测“.”吗?
【解决方案2】:

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

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... 该方法的唯一限制是版本号必须始终由两部分组成。 (如果你的名字不允许有.,它还可以支持单部分版本号。)

【讨论】:

    猜你喜欢
    • 2017-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多