在Windows Batch Script中我有一个变量。
VarSQL="Select * from Tablex where Timetstampcol < A_XXX_ABC"
我需要从上面的Select stmt with contains中找到String &#39; A_XXX&#39;并用另一个值替换它。
问题是我无法仅使用A_XXX从上面的变量中获取完整的字符串A_XXX_ABC。
有什么方法我可以知道哪个是包含A_XXX的完整字符串,因为A_XXX是唯一的常量子字符串,其他部分ABC将继续改变,如A_XXX_XYZ,A_XXX_OOO等。
请帮我解析代码并找到这样的字符串并将它们分配给变量。 我知道如何替换它,因为它非常基本。
由于
答案 0 :(得分:0)
以下代码段搜索VarSQL
中的输入字符串,并返回以SearchStr
中的值开头的第一个单词(SearchLen
必须包含搜索字符串的长度)。一个单词被认为是由以下任何字符分隔的每个字符串部分:*
,<
,>
,(
,)
,=
,,
,;
, SPACE (请参阅delims=
选项; SPACE 必须指定为最后一个):< / p>
@echo off
set "VarSQL=Select * from Tablex where Timetstampcol < A_XXX_ABC"
set "SearchStr=A_XXX"
set /A SearchLen=5
setlocal EnableDelayedExpansion
set "SubStr=%VarSQL%"
:LOOP
for /F "tokens=1,* eol= delims=*<>()=,; " %%I in ("%SubStr%") do (
if "%%I"=="" goto :SKIP
set "SubStr=%%I"
if not "!SubStr:~,%SearchLen%!"=="%SearchStr%" (
set "SubStr=%%J"
goto :LOOP
)
)
:SKIP
endlocal & set "SubStr=%SubStr%"
echo "%SubStr%"
然后,要实际用ReplaceStr
中的另一个字符串替换找到的字符串,请执行以下操作:
set "ReplaceStr=A_XXX_XYZ"
setlocal EnableDelayedExpansion
set "VarSQL=!VarSQL:%SubStr%=%ReplaceStr%!"
endlocal & set "VarSQL=%VarSQL%"
echo "%VarSQL%"
......或者,如果你想避免延迟扩张:
set "ReplaceStr=A_XXX_XYZ"
call set "VarSQL=%%VarSQL:%SubStr%=%ReplaceStr%%%"
echo "%VarSQL%"
答案 1 :(得分:0)
@echo off
setlocal EnableDelayedExpansion
set VarSQL="Select * from Tablex where Timetstampcol < A_XXX_ABC and Timetstampcol > coumnEndTS"
echo Before: !VarSQL!
for /F %%a in ("!VarSQL:*A_XXX=A_XXX!") do set "VarSQL=!VarSQL:%%a=A_ZZZ_OPQ!"
echo After: !VarSQL!
输出:
Before: "Select * from Tablex where Timetstampcol < A_XXX_ABC and Timetstampcol > coumnEndTS"
After: "Select * from Tablex where Timetstampcol < A_ZZZ_OPQ and Timetstampcol > coumnEndTS"