以下命令基于分隔符(在本例中为破折号或-
)前的文件名部分创建文件夹:
setlocal EnableExtensions DisableDelayedExpansion
set "SourceDir=C:UsersTSource"
set "DestDir=C:UsersTDest"
for /F "eol=| delims=" %%A in ('dir /B /A-D-H "%SourceDir%*-*.jpg" 2^>nul') do (
for /F "eol=| tokens=1 delims=-" %%B in ("%%~nA") do (
md "%DestDir%%%B" 2>nul
REM move /Y "%SourceDir%%%A" "%DestDir%%%B"
)
)
endlocal
具体来说,分隔符命令在这里:
delims=-
但是我需要在分隔符中包括一个空格,在破折号之前和之后。如何在delims
中包含空格?
如果将文件名分配给环境变量,则可以使用字符串替换来操作该变量。在第一个替换中,您可以通过使用带有字符串分隔符的通配符来删除文件名的第一部分。这将为您提供文件名的结尾部分。现在您有了文件名的结束部分,您可以反过来使用字符串分隔符和文件名的结束部分从原始文件名中删除。
setlocal EnableExtensions DisableDelayedExpansion
set "SourceDir=C:UsersTSource"
set "DestDir=C:UsersTDest"
for /F "eol=| delims=" %%A in ('dir /B /A-D-H "%SourceDir%*-*.jpg" 2^>nul') do (
set "string=%%~A"
setlocal enabledelayedexpansion
SET "end=!string:* - =!"
FOR /F "delims=" %%G IN ("!end!") do set "begin=!string: - %%~G=!"
md "%DestDir%!begin!" 2>nul
REM move /Y "%SourceDir%%%A" "%DestDir%!begin!"
endlocal
)
endlocal
您可以动态地将分隔字符串替换为单字符分隔符。我使用|
,因为它在文件名中无效,因此是唯一的。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceDir=C:UsersTSource"
set "DestDir=C:UsersTDest"
for /F "eol=| delims=" %%A in ('dir /B /A-D-H "%SourceDir%*-*.jpg" 2^>nul') do (
set "string=%%~A"
setlocal enabledelayedexpansion
FOR /F "tokens=1,2 delims=|" %%G IN ("!string: - =|!") do (
echo md "%DestDir%%%G" 2>nul
echo 1. move /Y "%SourceDir%%%A" "%DestDir%%%G%%~nxA"
echo 2. move /Y "%SourceDir%%%A" "%DestDir%%%G%%~nxH"
endlocal
)
)
这段代码在您的磁盘上没有做任何事情,因为我只是通过回显来解除更改命令的武装。删除move
命令前的echo
和echo 1.
或echo 2.
(只需删除您不想要/不需要的行)。第一个保留文件名完整,第二个将其缩短为第二部分(第一部分无论如何都会转换为文件夹名)