我想为以下场景创建批处理文件/ 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
我已经尝试了很多,但无法得到解决方案。感谢您的帮助。
答案 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
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
所需的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 ,md
和move
并设置{ {1}}标记以确保忽略找到的其他匹配项。
请注意,这不会处理您的文件名如某事 -abc_d-EFGH_JK- 某事的情况 - 它假定所需的目的地是第一次出现of string _ string ,在这种情况下为moved
,而不是abc_d
。如果需要,这很容易修复。
根据文件名结构的修正进行修订(没有下划线 - 仅限破折号)
EFGH_JK
新代码查找序列 - ???? - ?? - string - string 并选择最后一个。