如何在 FOR /F(批处理文件)的定界符中包含 space

How do I include a space in the delimiter of a FOR /F (batch file)

以下命令根据定界符前的文件名部分(在本例中为破折号或 -)创建文件夹:

setlocal EnableExtensions DisableDelayedExpansion
set "SourceDir=C:\Users\T\Source"
set "DestDir=C:\Users\T\Dest"

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=-

但我需要在破折号前后的分隔符中包含一个 space。我如何在 delims 中包含 space?

如果将文件名分配给环境变量,则可以使用字符串替换来操作该变量。在第一个替换中,您可以使用带字符串定界符的通配符来删除文件名的第一部分。这将为您提供文件名的结尾部分。现在您有了文件名的结尾部分,您可以转过来使用字符串定界符和要从原始文件名中删除的文件名的结尾部分。

setlocal EnableExtensions DisableDelayedExpansion
set "SourceDir=C:\Users\T\Source"
set "DestDir=C:\Users\T\Dest"

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:\Users\T\Source"
set "DestDir=C:\Users\T\Dest"
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 命令之前的 echoecho 1. echo 2. (只需删除您不 want/need).第一个保留文件名不变,第二个将其缩短为第二部分(无论如何第一部分都转换为文件夹名)