批量创建基于部分文件名的文件夹并将文件移动到该文件夹​​中

Jak*_*nin 4 windows directory batch-file

我在一个文件夹中有160万(!)个PDF文件.这些文件的名称都与此类似:

LAST_FIRST_7-24-1936 Diagnostic - Topography 11-18-10_1.pdf
LAST_FIRST_7-24-1936 Glasses RX 6-1-11_3.pdf
Run Code Online (Sandbox Code Playgroud)

我需要根据文件的第一部分创建一个文件夹,然后将该文件和具有相同文件名第一部分的所有其他文件移动到该文件夹​​中.在这种情况下,该文件夹将命名为"LAST_FIRST_7-24-1936".该文件夹的名称将始终与文件的第一部分相同,直到空格为止.

我想创建将执行此操作的批处理文件.凭借我的基本编程知识,我想出了这样做的逻辑过程:

1 Take the first file and name it var1
2 Remove everything after the space in var1 and name it var2
3 Create a folder named var2
4 Move the file var1 into the folder var2
5 If there are more files Go to line 1, otherwise end
Run Code Online (Sandbox Code Playgroud)

我不知道适当的语法是什么.

我找到了这个链接需要一个脚本来根据文件名创建文件夹,并 根据该链接自动移动我批量生成的文件

pushd D:\Data\Medinfo PDFs
for %%F in (*.pdf) do (
  2>nul md "%%~nF"
  >nul move /y "%%~nF*.*" "%%~nF"
)
popd
Run Code Online (Sandbox Code Playgroud)

但是,它不允许我仅从文件名的一部分创建文件夹名称.如果我能想出那部分,我认为它会起作用.我知道我需要为文件夹名称创建变量,但我不知道如何编辑文件名变量以删除空格后的所有内容.任何帮助,将不胜感激.只要它在Windows Server 2008 R2中本机运行,我就不反对在PowerShell或其他方面执行此操作.

Mag*_*goo 5

@ECHO OFF
SETLOCAL
SET "sourcedir=c:\sourcedir"
PUSHD %sourcedir%
FOR /f "tokens=1*" %%a IN (
 'dir /b /a-d "*_*_*-*-* *.*"'
 ) DO (  
 ECHO MD %%a
 ECHO MOVE "%%a %%b" .\%%a\
)
POPD
GOTO :EOF
Run Code Online (Sandbox Code Playgroud)

这应该完成所需的任务 - 或者至少显示所需的指令.

如果您对发出的命令感到满意,请设置sourcedir为所需的根目录并删除echo要激活的两个关键字.

MD尝试重新创建现有目录时生成的"目录已存在"消息可以通过附加2>nul到该MD行来抑制.

类似地,可以通过附加>nulMOVE行来抑制已移动一个文件的报告.

2>nul 抑制错误消息(尝试创建现有目录是一个错误),而'文件移动'消息是一个普通的输出消息,因此不同.


附录 - 它是如何工作的.

首先,PUSHD将当前目录设置为目标.
DIR命令输出由标记化FOR/F.该tokens=1*子句指示将第一个标记(1)分配给指定的元变量(%%a),并隐式地将第二个标记(*)分配给%%b- 按字母顺序排列.令牌*意味着everything after those token numbers explicitly mentioned.不使用delims子句,因此使用默认分隔符(SEPARATORS集)SPACE , ; TAB.

DIR的目标是掩码*_*_*-* *.*,因此只能找到与该掩码相匹配的文件 - *意思是any number of any characters- .因为掩码是掩码中"quoted"包含的空格.如果没有引号,将指定两个单独的掩码.该/b选项以基本形式生成列表,即仅名称,无标题或摘要.该/a-d选项禁止任何可能已安装掩码的目录名称.

因此,对于 LAST_FIRST_7-24-1936 Diagnostic - Topography 11-18-10_1.pdf,该dir列表LAST_FIRST_7-24-1936 Diagnostic - Topography 11-18-10_1.pdfFOR/Ftokenises作为LAST_FIRST_7-24-1936%%aDiagnostic - Topography 11-18-10_1.pdf%%b使用SPACE作为分隔符.

文件名然后可以通过重新插入之间的空间被重建%%a%%b.需要引用包含分隔符的任何文件名来对字符进行分组,并表示它们不是分隔元素.移动目标\以指定"这是目录名称" 终止.

POPD恢复原始记录的目录.