在处理使用一种基于输入的自设置定界符的脚本时,我发现有点好奇将分号作为 %variable% 注入
for
参数。
令人惊讶的是,将
for /F "delims=...
设置为变量似乎很少。
只是来自 2015 年 3 月 的这个孤独的问题和单一的答案。然而,从那里很少,使用setLocal enableDelayedExpansion
和一些(如另一个答案中所述)waton滥用
for
循环和
endlocal & set...
我能够让我的熟食填充(仅挑战通过
!%str%:~0,1!
空白与
!%~1:~0,1!
) 正常扩展到主循环。这很好用,除了例外......条形分隔符显然会破坏事物。我已经尝试过,但如果不通过改变进入主循环的计数来破坏其他一切,我似乎无法让他们工作。这是微不足道的,但我不禁觉得这里的解决方案是另一个有问题的符号分号的解决方案。
分号是一只奇怪的鸭子。有了
@ECHO ON
,他们似乎正确地填充了
delims=%delim%
,但不要剥离和破坏定界,即使是
eol=
。更奇怪的是,如果明确设置为
"eol= delims=;"
,分号将完全按预期工作。虽然分号不是必需的,但我情不自禁地觉得从现在开始可能会有几步。即使有很多选择,这让我很好奇发生了什么,如果它可以在没有许多额外代码行的情况下解决,假装一分钟分号对以后的功能至关重要。
脚本如下。它包含一些 readline 输入示例、预期输出以及有关结果的注释,以便于调试。 Readline 输入可以直接设置,也可以在执行期间设置(取决于个人 RL 历史偏好)。
@ECHO OFF
@set ESC=
setLocal
if "%*" == "" (set /P strInput=Input parameters:) else set "strInput=%*"
call :delimVars strInput
endLocal
exit /B
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:delimVars [[delim]value str]...
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: input: ?~delim So long world ?~delim Goodbye universe ^& Hello multiverse %=(strips)=%
:: input: /~delim So long world /~delim Goodbye universe ^& Hello multiverse %=(strips)=%
:: input: \~delim So long world \~delim Goodbye universe ^& Hello multiverse %=(strips)=%
:: input: ^~delim So long world ^~delim Goodbye universe Hello multiverse
:::::::::::: ^ strips w/ interesting side effects
:: input: $~delim So long world$~delim Goodbye universe ^& Hello multiverse %=(strips)=%
:: input: %%~delim So long world%%~delim Goodbye universe ^& Hello multiverse %=(strips)=%
:: input: ^~delim So long world ^~delim Goodbye universe ^& Hello multiverse %=(strips)=%
:: input: *~delim So long world *~delim Goodbye universe ^& Hello multiverse %=(strips)=%
:: input: =~delim So long world =~delim Goodbye universe ^& Hello multiverse %=(strips)=%
:: input: #~delim So long world #~delim Goodbye universe ^& Hello multiverse %=(strips)=%
:: input: ,~delim So long world ,~delim Goodbye universe ^& Hello multiverse %=(strips)=%
:: input: '~delim So long world '~delim Goodbye universe ^& Hello multiverse %=(strips)=%
:: input: :~delim So long world :~delim Goodbye universe ^& Hello multiverse %=(strips)=%
:: input: |~delim So long world |~delim Goodbye universe ^& Hello multiverse %=(breaks)=%
:::::::::::: uncertain how to escape w/o impacting parsing of other symbols
:: input: ;~delim So long world ;~delim Goodbye universe ^& Hello multiverse %=(sticks)=%
:::::::::::: unique behaviour of semi-colon breaks delimination, even with "eol= "
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setLocal disableDelayedExpansion
set "str=%~1"
setLocal enableDelayedExpansion
for /F %%X in ("!%~1:~0,1!") do ( %=(Param var Expansion must be used, str var blanks)=%
endLocal
set "delim=%%~X"
)
:delimVars_loop
setLocal enableDelayedExpansion
REM for /F "eol= tokens=1,* delims=;" %%A in ("!%str%!") do ( %=(Semi-colons strip)=%
for /F "eol= tokens=1,* delims=%delim%" %%A in ("!%str%!") do ( %=(Semi-colons stick)=%
for /F "eol= tokens=1,* delims= " %%a in ("%%A") do (
endLocal
set "val="%%~a" "%%~b""
)
)
)
echo;%val%
set str=
set val=
set delim=
endLocal
exit /B