AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1538028
Accepted
JDR
JDR
Asked: 2020-04-02 15:56:28 +0800 CST2020-04-02 15:56:28 +0800 CST 2020-04-02 15:56:28 +0800 CST

用于更改目录名称和移动目录的 Windows 10 批处理文件

  • 772

我有五十个目录,成对的,名称如下:

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=-"
但是我对此无能为力。

我花了几个小时无处可去,所以我希望有人能帮忙!

谢谢。

windows-10 batch-rename
  • 3 3 个回答
  • 1793 Views

3 个回答

  • Voted
  1. Best Answer
    DavidPostill
    2020-04-03T02:55:41+08:002020-04-03T02:55:41+08:00

    我如何能

    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>
    

    延伸阅读

    • Windows CMD 命令行的 AZ 索引 | SS64.com
    • Windows CMD 命令(分类) - Windows CMD - SS64.com
    • Dir - 列出文件和文件夹 - Windows CMD - SS64.com
    • For /f - 循环通过命令输出 - Windows CMD - SS64.com
    • 移动 - Windows CMD - SS64.com
    • Ren - 重命名 - Windows CMD - SS64.com
    • 1
  2. lewis hamilton
    2020-04-03T03:52:45+08:002020-04-03T03:52:45+08:00

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

    重命名 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> 注意,使用 rename 命令,我们不能移动文件到另一个驱动器或目录。此命令只是重命名现有文件/文件夹而不创建新文件。这就是为什么它不接受目标文件名的完整路径。如果您尝试这样做,您将收到错误 - “命令的语法不正确。”

    例子:

    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)上的文件或目录。

    • 0
  3. Io-oI
    2020-04-03T12:50:06+08:002020-04-03T12:50:06+08:00
    @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 代码可以自动执行任务,因此无需编辑。

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

    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 /?

    在互联网上,您可以获得更多帮助:

    • 放

    • 任

    • 目录

    • RD/RMDIR

    • 对于 /f

    • 转到:EOF

    • 启用延迟扩展

    • If, Else If, Else, If defined, Errorlevel ...

    • 条件执行 || && | 与运营商...

    • 0

相关问题

  • VMware Workstation USB 仲裁服务无法自动启动

  • 如何在域和 Linux 活动目录中启用指纹传感器

  • 资源管理器侧面板中的桌面外壳快捷方式

  • 为什么我不能将文件从 Android 发送到 Windows 10?

  • 在多个文件上打开方式?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve