如何在 FOR /F批处理文件的分隔符中包含空格

问题描述

以下命令基于分隔符(在本例中为破折号或 -)之前的文件名部分创建文件夹:

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

但是我需要在分隔符中包含一个空格,无论是破折号之前还是之后。我如何在 delims 中包含一个空格?

解决方法

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

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

此代码不会在您的磁盘上执行任何操作,因为我只是通过回显它们来解除更改命令的武装。删除 echo 命令之前的 moveecho 1. or echo 2.(只需删除您不想要/不需要的行)。第一个保持文件名不变,第二个将其缩短为第二部分(第一部分无论如何都转换为文件夹名)