批处理脚本:代码中莫名换行的原因排查
问题:给文件夹名称追加反斜杠时出现换行和多余空格
我尝试给字符串(文件夹名称)末尾追加反斜杠,未得到预期结果,反而出现换行、13个空格后才显示反斜杠。
重现代码
@echo off SETLOCAL ENABLEDELAYEDEXPANSION :: 用户从菜单选择文件夹后,结果存储在ChosenFolder中 :: ChosenFolder的典型值为"3 .\Folder1" set "ParentFolder=!ChosenFolder:~2!^\\" echo ParentFolder is !ParentFolder!
异常输出
ParentFolder is .\Folder1 \
手动设置ChosenFolder为"3 .\Folder"时,该问题不会出现。以下是生成异常ChosenFolder值的代码:
生成异常ChosenFolder的代码
SET "choicenames=z0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy" :: 清除以#开头的变量 FOR /F "delims==" %%e In ('set # 2^>Nul') DO SET "%%e=" FOR /L %%e IN (1,1,%pagewidth%) DO SET "#spaces=!#spaces! " :: 将目录名读取到#nn变量中,统计条目数到#entries FOR /d %%e IN ("%~1\*.") DO SET /a #entries+=1&SET "#!#entries!=%%e" SET /a #entries+=1&SET "#!#entries!=z Quit." SET /a #columns=(#entries + pagesize - 1) / pagesize SET /a #rows=(#entries + #columns - 1)/#columns SET /a #columnwidth=(pagewidth/#columns) - 3 SET "#choices=z" FOR /L %%e IN (1,1,%#entries%) DO ( rem 列内容 - 最大长度 + 末尾空格 IF %%e neq %#entries% ( SET "#%%e=!#%%e:~-%#columnwidth%!%#spaces%" SET "#%%e=!choicenames:~%%e,1! !#%%e:~0,%#columnwidth%!" SET "#choices=!#choices!!choicenames:~%%e,1!" ) ) FOR /L %%e IN (1,1,%#rows%) DO ( SET /a cols=%%e + %#rows% SET /a #line=%%e + (%#rows% * 2^) SET "cols=!cols! !#line!" SET "#line=!#%%e!" FOR %%y IN (!cols!) DO IF DEFINED #%%y SET "#line=!#line! !#%%y!" ECHO !#line! ) IF %#entries% gtr 36 ( choice /cs /c %#choices% ) ELSE ( choice /c %#choices% ) IF ERRORLEVEL 2 ( ECHO ERRORLEVEL is %ERRORLEVEL% SET /a #choices=%ERRORLEVEL%-1 CALL SET "ChosenFolder=%%#!#choices!%%" ECHO choice made : !ChosenFolder:~2! CHOICE /C snc /N /M "(S)elect, (N)avigate or (C)ancel? " IF errorlevel 3 goto begin IF errorlevel 2 CALL :SelectFolder !ChosenFolder:~2! IF errorlevel 1 EXIT /B 0 ) ELSE GOTO begin
问题根源
问题出在生成菜单条目时的字符串处理逻辑:
- 为了实现菜单列对齐,代码执行
SET "#%%e=!#%%e:~-%#columnwidth%!%#spaces%"给每个目录名追加大量空格,再通过!#%%e:~0,%#columnwidth%!截取固定长度。 - 这会导致目录名实际长度不足时,末尾被填充空格到固定长度,这些空格会被存入
#%%e变量。 - 当通过
!ChosenFolder:~2!提取文件夹名称时,这些末尾空格被一并保留。 - 在Windows批处理中,反斜杠紧跟空格时会被解释为换行转义,最终就出现了换行、空格后单独显示反斜杠的异常现象。
解决办法
提取文件夹名称后先移除末尾空格,再追加反斜杠。可以用循环精准去除末尾空格:
@echo off SETLOCAL ENABLEDELAYEDEXPANSION :: 提取文件夹名称 set "FolderName=!ChosenFolder:~2!" :: 循环去除末尾空格 :TrimTrailingSpaces if "!FolderName:~-1!"==" " set "FolderName=!FolderName:~0,-1!" & goto TrimTrailingSpaces :: 追加反斜杠 set "ParentFolder=!FolderName!\" echo ParentFolder is !ParentFolder!
内容的提问来源于stack exchange,提问作者fortissimo
相关产品推荐
相关产品推荐

