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

我在一个文件夹中有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 

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

我想创buildbatch file,将这样做。 凭借我基本的编程知识,我想出了这个逻辑过程:

 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 

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

我没有find这个链接需要一个脚本来创build基于文件名的文件夹,并自动移动文件我基于该链接进行批处理

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

但是,它不允许我从文件名的一部分创build文件夹名称。 如果我能把这一部分弄清楚,我认为它会起作用。 我知道我需要为文件夹名称创buildvariables,但我不知道如何编辑文件名variables来删除空格后的所有内容。 任何帮助,将不胜感激。 我不反对在PowerShell或其他方面做到这一点,只要它在Windows Server 2008 R2本地工作。

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

这应该完成所需的任务 – 或至少显示所需的说明。

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

MD在尝试重新创建现有目录时生成的“目录已经存在”消息可以通过在MD上附加2>nul来消除。

同样,一个文件已被移动的报告可以通过在MOVE行上追加>nul来消除。

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选项以基本形式生成列表,即仅命名,不包含标题或摘要。 /ad选项禁止任何可能适合掩码的目录名称。

因此,对于LAST_FIRST_7-24-1936 Diagnostic - Topography 11-18-10_1.pdfdir列出LAST_FIRST_7-24-1936 Diagnostic - Topography 11-18-10_1.pdfFOR/F标记为LAST_FIRST_7-24-1936 to %%aDiagnostic - Topography 11-18-10_1.pdf%%b使用SPACE作为分隔符。

然后可以通过重新插入%%a%%b之间的空格来重建文件名。 包含分隔符的任何文件名都需要被引用来将字符分组并且表示它们不是分隔的元素。 移动的目标是用\来终止指定“这是一个目录名称”。

POPD恢复原来的日志目录。

这真的帮了我,我做了一些修改,以处理我的数码照片(我是摄影师),并称为批处理文件FolderAndMove。 这是我的代码:

 @ECHO OFF SETLOCAL SET "sourcedir=***PASTE_DIRECTORY_HERE***" PUSHD %sourcedir% FOR /f "tokens=1,2,3,4 delims=_" %%a IN ( 'dir /b /ad "*_*_*_*.*"' ) DO ( MD %%a_%%b 2>nul MOVE "%%a_%%b_%%c_%%d" .\%%a_%%b\ >nul ) POPD GOTO :EOF 

这里是我为其他摄影师做的简单描述:

FolderAndMove将获取格式为*_*_*_*.* (如LastName_FirstInitial_Event#_Sequence#.JPG )的文件的文件夹,为每个唯一的*_*文件前缀在选定的根文件夹中创建一个文件夹(例如,LastName_FirstInitial ),并将*_*_*_*.*惯例之后的所有文件移动到与其前缀相对应的*_*文件夹中。

请注意,文件格式是精确的:变量(*)必须用下划线分隔(〜分段),以便FolderAndMove无效。