此脚本的目的是为以后(主要是更安全的)解析和删除准备一个 readline 和其他输入。
主要问题是尾随
set
报价。最初我怀疑有太多的事情与转义和特价有关,但调试已经查明了确切的原因。
这是我在下面的脚本中使用的 readline 输入,但请随意发挥创意(对于那些热衷于了解它的发展方向的人;是的,没有尾随引号,后面的过滤器效果很好)
_strFilter /VERBOSE /STRING "C:/Documents & Settings" /TESTstr"C:\Users\User" "Hello/Universe & Goodbye;World\" /_DEBUG "test\stray" "test|stray2" /TESTstr "^^%^^%^^!|#|^^!@|"
.
@ECHO OFF
echo;&echo Earlier working version ============================================================
setlocal disableDelayedExpansion
set "_userInput=" %* ""
set "_strArray=%_userInput%"
:: additional set filters here
set "_userInput_filter=%_strArray%"
echo;&echo;Prepared String ----- "%_userInput_filter%"
endlocal
echo;&echo Prefered implementation ============================================================
setLocal
set "_userInput=" %* "" %=(Breaks without quotes, spaces are needed later, though have no impact)=%
call :_strFilter_prepare _userInput_filter "%%_userInput%%"
echo;&echo;Prepared String ----- "%_userInput_filter%"
endlocal
exit /B
:_strFilter_prepare varName strVal
setlocal disableDelayedExpansion
:: set _strArray=""%*"" %=(Throws errors)=%
:: set "_strArray=%*" %=(Throws errors)=%
:: set "_strArray="%*" %=(Bad syntax)=%
set "_strArray="%*"" %=(This is where the extra quote gets pulled through)=%
:: additional set filters here
:: for /F "tokens=1,*" %%A in ("%_strArray:~0,-1%") do ( %=(Syntax breaks)=%
for /F "tokens=1,*" %%A in ("%_strArray%") do (
endLocal
set %%~A=%%~B
)
exit /B
两者的输出是相同的,但首选的实现有一个尾随双引号,它打破了行:
Escaped String ----- "" /VERBOSE /STRING "C:/Documents (AMP) Settings" /TESTstr"C:\Users\User" "Hello/Universe (AMP) Goodbye;World\" /_DEBUG "test\stray" "test(BAR)stray2" /TESTstr "(CARET)(CARET)%(CARET)(CARET)%(CARET)(CARET)(EXCLAIM)(BAR)#(BAR)(CARET)(CARET)(EXCLAIM)@(BAR)" """
这是使用“正确的”
set
方法,任何其他对 set
命令的引用都会破坏事物。我的目标输出缺少最后一个引用,使用首选实现。