在 batch/cmd 中带有附加问题尾随双引号的输入集过滤功能

问题描述 投票:0回答:0

此脚本的目的是为以后(主要是更安全的)解析和删除准备一个 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
命令的引用都会破坏事物。我的目标输出缺少最后一个引用,使用首选实现。

batch-file cmd
© www.soinside.com 2019 - 2024. All rights reserved.