4

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

我需要根据文件的第一部分创建一个文件夹,然后将该文件和具有相同文件名第一部分的所有其他文件移动到该文件夹​​中。在这种情况下,文件夹将命名为“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

我不知道正确的语法是什么。

我确实找到了这个链接需要一个脚本来根据文件名创建文件夹,并自动移动文件 我根据那个链接制作了这批文件

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

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

4

2 回答 2

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

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

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

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

类似地,一个文件已被移动的报告可以通过附加>nul到该MOVE行来抑制。

2>nul抑制错误消息(尝试创建现有目录是错误的),而“文件已移动”消息是普通的输出消息,因此有所不同。


附录 - 它是如何工作的。

首先,PUSHD将当前目录设置为目标。命令输出
由. 该子句指示将第一个标记 (1) 分配给指定的元变量 ( ),并将第二个标记 (*) 隐式分配给- 只是按字母顺序排列的下一个。令牌的意思。没有使用子句,因此使用了默认分隔符(SEPARATORS 集。DIRFOR/Ftokens=1*%%a%%b*everything after those token numbers explicitly mentioneddelimsSPACE , ; TAB

DIR目标是掩码*_*_*-* *.*,因此只有与该掩码匹配的文件 - 其中*表示any number of any characters- 才会被定位。因为掩码"quoted"是包含在掩码中的空格。如果没有引号,将指定两个单独的掩码。该/b选项以基本形式生成一个列表,即只有名称,没有标题或摘要。该/a-d选项抑制任何可能适合掩码的目录名称。

因此,对于 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以及%%a使用Diagnostic - Topography 11-18-10_1.pdf作为%%b分隔SPACE符。

然后可以通过重新插入 和 之间的空格来重建文件%%a%%b。任何包含分隔符的文件名都需要被引用以对字符进行分组并表明它们不是分隔元素。移动的目标\以指定“这是目录名”结束。

POPD 恢复原始记录目录。

于 2013-11-15T04:06:52.490 回答
0

这真的帮了我大忙,我做了一点修改来处理我的数码照片(我是一名摄影师),并将批处理文件命名为 FolderAndMove。这是我的代码:

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

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

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

请注意,文件格式是准确的:变量 (*) 必须用不带空格的下划线分隔(~分段),FolderAndMove 才能正常工作。

于 2016-02-07T00:40:43.873 回答