根据文件名的一部分批量创建文件夹,但不保留扩展名

时间:2019-01-17 12:24:03

标签: batch-file

试图创建一个脚本,该脚本将使用文件名的第三个标记,并基于该脚本创建一个文件夹,并将关联的文件移至该文件夹。

到目前为止已经掌握了

@ECHO OFF
SETLOCAL
SET "sourcedir=D:\Sourcedir"
PUSHD %sourcedir%
FOR /f "tokens=1,2,3,4 delims=" %%a IN (
 'dir /b /a-d "*.pdf"'
 ) DO (  
 ECHO MD %%c
 ECHO MOVE "%%a %%b %%c %%d" .\%%c\
)
POPD
GOTO :EOF

唯一的问题是正在创建的文件夹包含文件扩展名,因为我只需要将文件夹命名为第三个标记即可。

示例文件名:

  

“文件编号10.pdf

预期的文件夹名称:

  

10

谢谢

3 个答案:

答案 0 :(得分:0)

您为什么使用delims=?这将删除定界符,并将整行带到%%a
试试这个:

@ECHO OFF
SETLOCAL
SET "sourcedir=D:\Sourcedir"
PUSHD %sourcedir%
FOR /f "tokens=1,2,3" %%a IN (
 'dir /b /a-d "*.pdf"'
 ) DO (  
 ECHO MD %%~nc
 ECHO MOVE "%%a %%b %%c" .\%%~nc\
)
POPD

GOTO :EOF

如果未设置delims=,它将使用空格。因此%%c将是10.pdf~n是提取其 n 相同部分。

这是基于您的问题的,您可以将%%a %%b %%cspaces串联在一起,这很简单。
如果文件名比较复杂,那么内部for循环会更好。
  -哪个问题已经给出了很好的解决方案。

答案 1 :(得分:0)

您可以运行2个for循环在第一个循环中获取全名,然后在第二个循环中拆分名称,获取第三个令牌,创建目录,然后从第一个循环中复制实际文件名。

这样,您无需再次尝试将名称拼凑在一起,我知道它可以工作,但是它很丑陋,不受欢迎:

@echo off
setlocal enabledelayedexpansion
set "sourcedir=D:\Sourcedir"
pushd %sourcedir%
for %%a in (*.pdf) do (
    set "var=%%a"
   for /f "tokens=3" %%i in ("!var!") do (
     echo md "%%~ni"
     echo move "%%~a" "%%~ni"
  )
)
popd
goto EOF

有关这些命令的更多信息,请参见cmd.exe中的每个命令的帮助,例如

for /?
set /?
setlocal /?

setsetlocal具有有关延迟扩展的非常具体的信息。

答案 2 :(得分:0)

这是一个替代方案,它将只使用最后一个用空格分隔的字符串/数字,而不管它有多少,(如果没有,它将使用整个文件名)

@Echo Off
For %%A In ("D:\Sourcedir\*.pdf") Do Call :L "%%A"
Exit /B

:L
Set "F=%~n1"
Set "F=%F: ="&Set "F=%"
If Not Exist "%~dp1%F%\" MD "%~dp1%F%"
Move /Y %1 "%~dp1%F%"

如果只想移动至少有一个空格的空格,可以将其包括在For括号内。

@Echo Off
For %%A In ("D:\Sourcedir\* *.pdf") Do Call :L "%%A"
Exit /B

:L
Set "F=%~n1"
Set "F=%F: ="&Set "F=%"
If Not Exist "%~dp1%F%\" MD "%~dp1%F%"
Move /Y %1 "%~dp1%F%"