从文件名模式创建文件夹并将文件移动到这些文件夹

时间:2017-08-02 14:42:51

标签: batch-file command-prompt

我想为以下场景创建批处理文件/ windows命令:

我在文件夹中有一个文件列表,其中包含特定的文件名模式... XXXX_XX 其中 X 主要是一个数字。 这里的主要问题是该模式的位置实际上并未固定,并且可能出现在文件名中的任何位置。

例如:

这些是文件名:
1. ABCD-33-21234- 4652_00 -2017-03.txt
2. SECA-11- 4652_00 -2017-03.txt
3. 8888-asde0-dswc-33- 4444_55 -2016-05.txt

我需要将这些文件移动到目录中(如果不存在则创建它们)名称 XXXX_XX

所以基本上我需要将它们移动到文件夹中:

... \ 4652_00 \ ABCD-33-21234-的 4652_00 -2017-03.txt
....的 \ 4652_00 \ SECA-11-的 4652_00 -2017-03.txt
....的 \ 4444_55 \ 8888-asde0-DSWC-33-的 4444_55 -2016-05.txt

我已经尝试了很多,但无法得到解决方案。感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这是一个包裹PowerShell一个衬垫的cmd线解决方案 批量使用时,% - 符号必须加倍%%

我的ram磁盘上的示例输出A:

> tree /F
A:.
    8888-asde0-dswc-33-4444_55-2016-05.txt
    ABCD-33-21234-4652_00-2017-03.txt
    SECA-11-4652_00-2017-03.txt
powershell -NoP -C "dir *.txt|where {$_.BaseName -match '-(\d{4}_\d{2})-20'}|%{MD $matches[1] -EA 0;$_|Move -Dest {$matches[1]}}"
> tree /F
A:.
├───4444_55
│       8888-asde0-dswc-33-4444_55-2016-05.txt
└───4652_00
        ABCD-33-21234-4652_00-2017-03.txt
        SECA-11-4652_00-2017-03.txt

基本是正则表达式-(\d{4}_\d{2})-20,它匹配模式-xxxx_xx-20,括号(xxxx_xx)标记我们感兴趣的组。

没有PowerShell脚本别名的更详细的版本:

Get-ChildItem *.txt |
  Where-Object BaseName -Match  '-(\d{4}_\d{2})-20'|
    ForEach-Object {
      mkdir $matches[1] -ErrorAction SilentlyContinue
      $_ | Move-Item -Destination {$matches[1]}
    }

答案 1 :(得分:1)

@ECHO Off
SETLOCAL enabledelayedexpansion
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
FOR /f "delims=" %%a IN (
 'dir /b /a-d "%sourcedir%\*-????_??-*.txt" '
 ) DO (
 SET "filename=%%a"
 SET "filename=!filename:-= !"
 SET "moved="
 FOR %%b IN (!filename!) DO IF NOT DEFINED moved (
  FOR /f "tokens=1*delims=_" %%p IN ("%%b") DO IF "%%q" neq "" (
   ECHO MD "%destdir%\%%p_%%q" 2>NUL
   ECHO MOVE "%sourcedir%\%%a" "%destdir%\%%p_%%q\"
   SET "moved=Y"
  )
 )
)

GOTO :EOF

您需要更改sourcedirdestdir的设置以适合您的具体情况。

所需的MD命令仅用于ECHO用于测试目的。 在您确认命令正确无法后,将ECHO(MD更改为MD以实际创建目录。附加2>nul以禁止错误消息(例如,当目录已存在时)

为了测试目的,所需的MOVE命令仅为ECHO在您确认命令正确后,将ECHO(MOVE更改为MOVE以实际移动文件。附加>nul以取消报告消息(例如1 file moved

dir命令将每个与文件掩码匹配的文件名返回到%%a,然后返回filename

然后-中的每个filename都被空格替换,for..%%b将文件名作为空格分隔的字符串列表处理。

%%b中的每个字符串都被标记化,第一个匹配 string _ string 的字符串被分配给%%p%%q。如果%%q非空,那么我们找到 string _ string mdmove并设置{ {1}}标记以确保忽略找到的其他匹配项。

请注意,这不会处理您的文件名如某事 -abc_d-EFGH_JK- 某事的情况 - 它假定所需的目的地是第一次出现of string _ string ,在这种情况下为moved,而不是abc_d。如果需要,这很容易修复。

根据文件名结构的修正进行修订(没有下划线 - 仅限破折号)

EFGH_JK

新代码查找序列 - ???? - ?? - string - string 并选择最后一个。