关于项目中的机械师3

关于项目中的机械师3

我有 50 个目录,成对出现,名称如下:

ABC123-aaa-X0001  
ABC123-bbb-X0001  
XYZ456-aaa-X0001  
XYZ456-bbb-X0001  
SDF543-aaa-X0001  
SDF543-bbb-X0001  

我想要删除名称中的所有“-aaa-X0001”部分,最终得到以下内容:

ABC123  
ABC123-bbb-X0001  
XYZ456  
XYZ456-bbb-X0001  
SDF543  
SDF543-bbb-X0001

然后我想移动“-bbb-X0001”目录放入相应的重命名目录中,最终得到:

ABC123  
XYZ456  
SDF543  

因此,它们各自都包含相应“-aaa-X0001“目录,加上相应的“-bbb-X0001”目录作为子目录。

我希望这一切都使用批处理文件来完成。

要重命名目录,我首先尝试使用REN命令:

REN *-aaa-X0001 *

我很快发现通配符不适用于目录名。

然后我尝试使用MOVE命令:

MOVE *-aaa-X0001 *

这也不起作用。

我还尝试了各种基于以下方面的想法:

for /d "tokens=1,2,3 delims=-"
但对此我却无能为力。

我已经花了几个小时却没有任何进展,所以我希望有人能帮助我!

谢谢。

答案1

我如何

  1. 删除名称中的所有“-aaa-X0001”部分

  2. 将“-bbb-X0001”目录移动到相应的重命名目录中

使用以下批处理文件(test.cmd):

@echo off
for /f "tokens=1-3 delims=-" %%a in ('dir /b /a:d') do (
  if [%%b]==[aaa] (
    ren %%a-%%b-%%c %%a
    )
  if [%%b]==[bbb] (
    move %%a-%%b-%%c %%a
    )
  )

使用示例:

F:\test\test>dir /b/s
F:\test\test\ABC123-aaa-X0001
F:\test\test\ABC123-bbb-X0001
F:\test\test\XYZ456-aaa-X0001
F:\test\test\XYZ456-bbb-X0001
F:\test\test\SDF543-aaa-X0001
F:\test\test\SDF543-bbb-X0001
F:\test\test\test.cmd

F:\test\test>test
        1 dir(s) moved.
        1 dir(s) moved.
        1 dir(s) moved.
F:\test\test>dir /b/s
F:\test\test\test.cmd
F:\test\test\ABC123
F:\test\test\XYZ456
F:\test\test\SDF543
F:\test\test\ABC123\ABC123-bbb-X0001
F:\test\test\XYZ456\XYZ456-bbb-X0001
F:\test\test\SDF543\SDF543-bbb-X0001

F:\test\test>

进一步阅读

答案2

在从命令行重命名文件中,我们了解了如何使用重命名命令重命名文件。我们也可以使用重命名命令重命名目录。请参阅下面的语法。

重命名 dir_oldname dir_newname 示例:

G:\data>mkdir dir1 G:\data>dir /b dir1 G:\data>rename dir1 dir2 G:\data>dir /b dir2 G:\data> 请注意,使用重命名命令,我们无法将文件移动到另一个驱动器或目录。此命令仅重命名现有文件/文件夹,而不会创建新文件。这就是为什么它不接受目标文件名的完整路径。如果您尝试这样做,您将收到错误 - “命令的语法不正确。”

例子:

C:\docs>ren 1.txt c:\docs\2.txt 该命令的语法不正确。下面的重命名命令可以正常工作。

C:\docs>ren c:\docs\1.txt 2.txt C:\docs>dir /b 2.txt 我们还可以使用 ren(rename 的缩写)进行重命名操作。Ren 和 Rename 都指同一个命令。

此命令可用于重命名所有 Windows 操作系统版本(即 Windows 2000、XP、Vista 和 Windows 7)上的文件或目录。

答案3

@echo off && setlocal enabledelayedexpansion

for /f "tokens=1-3 delims=-" %%a in ('dir /b /a:d "*-*-*"')do >nul (
     if not "!_dir!" == "" move /y "%%~fa-%%~b-%%~c" "!_dir!"
     set "_dir=" <nul || set "_dir=%%~fa-%%~b-%%~c"
    )

for /f tokens^=1-3^delims^=^- %%a in ('dir /b /a:d "*-*-*"')do >nul (
     move /y "%%~fa-%%~b-%%~c" "%%~fa"
    )

endlocal && goto :EOF

在此处输入图片描述

对于具有可预测名称布局的五十个或更多目录,此 bat/cmd 代码可以自动执行任务,因此无需进行任何编辑。

因此,您不需要将所有已知文件夹名称添加到任何if您的条件/文件。

1)用一个for /f循环列出所有以布局目标分隔的文件夹-并使用1-2-3代币,以及%%~a-%%~b-%%~c文件夹名称布局已变得相同SDF543-bbb-X0001

for /f tokens^=1-3delims^=^- %%a in ('dir /on/b/a:d *-*-*')do
  • 观察:列出文件夹姓名顺序/on

2)您可以使用if not检查变量中是否定义了任何值(上一个/最后一个列出的文件夹)_dir,如果条件为真,则当前文件夹将移动到上次定义的上一个文件夹名称的路径_dir变量,并且仅当路径和名称的一部分与当前变量匹配时才会发生这种情况%~fa

if not "!_dir!" == "" move /y "%%~fa-%%~b-%%~c" "!_dir!"

3)下一个命令对我来说是没有意义的,也就是说,我不知道它是如何工作的,即使理论上它不应该工作,但事实上它是有效的......

set "_dir=" <nul || set "_dir=%%~fa-%%~b-%%~c"

4)添加第二个 for 循环以根据需要重命名文件夹,删除-%%~b-%%~c从名字上

move /y "%%~fa-%%~b-%%~c" "%%~fa"

关于项目中的机械师3

我承认我不明白它是如何工作的,而且我缺乏知识来解释这里做了什么,对此我很抱歉,理论是这样的:

rem :: Command              ::  Explanation

set "_dir=" <nul            ::  remove _dir variable/value

set "_dir=" <nul ||         :: if _dir variable was not removed by set "_dir=" <nul
                            :: the next command will by executed 
                            :: this "||" is called "operator" 

set "_dir=%%~fa-%%~b-%%~c"  :: if _dir variable was not removed, set the string 
                            :: below to the value for the _dir variable:
                            :: %%~fa-%%~b-%%~c is the same to drive:\path\name_folder

命令set "_dir =" <null似乎总是被执行,操作员||永远不应该执行命令set "_dir = %%~fa-%%~b-%%~c",但使用启用了延迟扩展的变量,这可能是使其起作用的解释。


对于命令行帮助,您可以使用/?

set /?, Ren /?, For /?, Dir /?, Setlocal /?, Endlocal /?, Goto /?, if /?, RMDir /?, RD /?

在互联网上,您可以获得更多有关以下方面的帮助:

相关内容