批处理拆分逗号分隔字符串循环调用sqlplus函数异常问题
批处理拆分逗号分隔字符串循环执行异常解决方案
问题原因
for /F指令默认仅会提取每行的第一个分隔字段,剩余字段需要手动通过%%b、%%c等占位符获取,对于长度不固定的待拆分字符串,无法提前写死占位符数量,因此仅会执行一次循环。
解决方案
方案1:普通for循环遍历(适用于子串无空格的场景)
通过字符串替换将逗号转为带引号的空格分隔符,即可用普通for循环遍历所有子串:
@echo off setlocal enabledelayedexpansion :: 赋值时不要给变量值加外层引号,方便后续处理 set "CCVs=0008123123,000815432123" :: 将逗号替换为" ",把字符串转为""分隔的多参数格式 set "CCVs=!CCVs:,=" "!" :: 遍历所有子串,%%~a会自动去掉子串外层的引号 for %%a in ("!CCVs!") do ( SQLPLUS -S -L %DBCONN% @%~dp0generate.sql %%~a ) endlocal
方案2:goto循环迭代拆分(适用于子串含空格的场景)
如果拆分后的子串本身包含空格、分号等批处理默认分隔符,可使用迭代截取的方式处理,兼容性更强:
@echo off setlocal enabledelayedexpansion set "CCVs=0008123123,000815432123,带空格的子串 1234" :split_loop :: 提取当前第一个逗号前的子串 for /f "delims=," %%a in ("!CCVs!") do ( SQLPLUS -S -L %DBCONN% @%~dp0generate.sql "%%~a" ) :: 移除已处理的第一个子串和后续逗号 set "remaining_str=!CCVs:*,=!" :: 剩余内容和原内容一致说明没有逗号,拆分完成 if "!remaining_str!"=="!CCVs!" goto end_loop set "CCVs=!remaining_str!" goto split_loop :end_loop endlocal
内容的提问来源于stack exchange,提问作者campanoon
相关产品推荐
相关产品推荐

