假设我有一个这样的查询作为批处理脚本中findstr命令的输出出现:
select a, b, c FROM table1, table2, table3 WHERE something happens
或类似的
select a, b, c from table1
我想选择表名并将它们放在某个地方。 现在,问题在于第一步是“切除” FROM和WHERE条件之间的任何内容 或查询的结尾。我检查了批处理字符串管理工具,但似乎没有任何帮助,因为 其中大多数是基于了解我要提取的数据的确切位置。为了简单起见 假定没有多余的空间可以修剪,并且FROM和WHERE不超过一个 每个查询字词。有线索吗?
答案 0 :(得分:2)
使用带通配符的字符串替换来分隔前/后缀
:: Q:\Test\2018\12\06\SO_53652818.cmd
@Echo off
set "string=select a, b, c FROM table1, table2, table3 WHERE something happens"
set "suffix=%string:*where=%"
call set "string=%%string: where%suffix%=%%"
set "tables=%string:* from =%%"
set tables
set "string=select a, b, c from table1"
set "suffix=%string:*where=%"
call set "string=%%string: where%suffix%=%%"
set "tables=%string:* from =%%"
set tables
或将单词where
,from
更改为单个字符分隔符
@Echo off
set "string=select a, b, c FROM table1, table2, table3 WHERE something happens"
set "string=%string: where =|%"
set "string=%string: from =|%"
for /f "tokens=2 delims=|" %%A in ("%string%") Do set "tables=%%A"
set tables
使用PowerShell作为工具的另一种替代方法,
正则表达式,具有环视功能(零长度断言),可避免dbenham
@Echo off
set "string=select a, b, c FROM table1, table2, table3 WHERE Country='Mexico'"
For /f "usebackq delims=" %%A in (`
powershell -NoP -C "if($ENV:String -match '(?<=FROM ).*?(?= (WHERE|GROUP|ORDER))'){$Matches[0]}"
`) do set "tables=%%A"
set tables
答案 1 :(得分:1)
更简单:
@echo off
set "string=select a, b, c FROM table1, table2, table3 WHERE something happens"
set "string=%string: WHERE =" & rem "%"
set "string=%string: FROM =" & set "tables=%"
set tables
我可以对使用的方法进行详细说明,但是如果您仅删除@echo off
行,运行程序并仔细查看执行的代码,则这样会更简单。
如果还有其他问题,请发表评论。