试图创建一个脚本,该脚本将使用文件名的第三个标记,并基于该脚本创建一个文件夹,并将关联的文件移至该文件夹。
到目前为止已经掌握了
@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
谢谢
答案 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
%%c
与spaces
串联在一起,这很简单。
如果文件名比较复杂,那么内部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 /?
set
和setlocal
具有有关延迟扩展的非常具体的信息。
答案 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%"