【问题标题】:How do I include a space in the delimiter of a FOR /F (batch file)如何在 FOR /F(批处理文件)的分隔符中包含空格
【发布时间】:2021-05-20 20:23:33
【问题描述】:

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

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 中包含空格?

【问题讨论】:

  • 分隔符是一组单个字符,而不是字符串。 "Delims=ab 在每个 a 和每个 b 处拆分。
  • @Stephan 我不知道。有没有办法修改现有脚本以获取字符串而不是字符?

标签: batch-file command whitespace delimiter


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以即时将分隔字符串替换为单字符分隔符。我使用了|,因为它在文件名中无效,因此是唯一的。

    @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.(只需删除您不需要/不需要的行)。第一个保留文件名完整,第二个将其缩短为第二部分(第一部分无论如何都转换为文件夹名)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多