我有 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
我如何
删除名称中的所有“-aaa-X0001”部分
将“-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 /?
在互联网上,您可以获得更多有关以下方面的帮助: