批处理空格的问题。。用for命令解决空格。一般都用"delims=" 。。请看我写的这个吧。。帮帮我。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批处理空格的问题。。用for命令解决空格。一般都用"delims=" 。。请看我写的这个吧。。帮帮我。相关的知识,希望对你有一定的参考价值。

set pathF=C:\Documents and Settings\xiaohang\桌面\test\
set pathN=b.bat
setlocal enabledelayedexpansion
for /f %%a in ('dir "%pathF%%pathN%"/b/s') do (
set /a b=!random!%%6
set /a d=!random!%%60
modtime.exe %%a 2011-05-01 13:1!b!:!d!
rem (问题就在这里。如果路径为桌面的。%%a就是C:\Documents ,我加上"delims="的话,modTime不会执行。)
)
pause

modtime.exe是一个修改时间的小程序。网上下的。他支持命令的。
格式如:ModTime.exe abc.dll 2007-11-7 11:19:28

如果路径中是没空格的话。modTime修改时间成功。。
如果有空格的话。modTime修改不了时间。我在for 加入"delims="把空格去掉。modTime一样不工作。
这个小程序不是自己的东西。改不了。只能看哪位大哥帮我改改代码。解决问题。。

除了for命令中加"delims="
modtime.exe 中的 %%a 也要加引号
for命令部分修改如下:
for /f "delims=" %%a in ('dir "%pathF%%pathN%"/b/s') do (
set /a b=!random!%%6
set /a d=!random!%%60
modtime.exe "%%a" 2011-05-01 13:1!b!:!d!
)
pause
参考技术A "delims= "等于号跟后引号之间有两个空格

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

【中文标题】如何在 FOR /F(批处理文件)的分隔符中包含空格【英文标题】:How do I include a space in the delimiter of a FOR /F (batch file) 【发布时间】: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 我不知道。有没有办法修改现有脚本以获取字符串而不是字符? 【参考方案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.(只需删除您不需要/不需要的行)。第一个保留文件名完整,第二个将其缩短为第二部分(第一部分无论如何都转换为文件夹名)

【讨论】:

以上是关于批处理空格的问题。。用for命令解决空格。一般都用"delims=" 。。请看我写的这个吧。。帮帮我。的主要内容,如果未能解决你的问题,请参考以下文章

cmd for命令中空格

请教问题 关于批处理的FOR命令

批处理在设置时间时,时分秒后总会出现空格,为啥?之前年月日中日也会出现这样的问题,输入set d

bat批处理去除删掉文件里每行尾端(右)空格

批处理,如何在for 中的 delims 中设置空格和其他字符做分隔符

bat含有空格的参数传递