如果在批处理脚本中只有部分字符串,则如何在变量中查找字符串

时间:2015-10-19 10:46:34

标签: windows string batch-file scripting batch-processing

在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等。

请帮我解析代码并找到这样的字符串并将它们分配给变量。 我知道如何替换它,因为它非常基本。

由于

2 个答案:

答案 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"