Windows批处理如何用两个变量实现字符串子串包含检查?
Windows批处理判断变量字符串是否包含另一变量子串的实现
之前参考批处理字符串判断的相关解答,硬编码子串的版本可以正常运行:
set YourString=This is a test If NOT "%YourString%"=="%YourString:test=%" ( echo Yes ) else ( echo No )
这个版本的逻辑是:将原字符串中指定的硬编码子串替换为空,若替换后内容和原字符串不一致,说明原字符串包含目标子串,输出Yes,否则输出No。
但这个写法无法直接把硬编码的test替换为自定义变量,多次尝试双变量拼接的修改方案都没有生效。
核心需求:不编写冗余代码,实现判断YourString变量对应的字符串是否包含OtherString变量对应子串的功能。
当前编写的测试代码运行异常,代码如下:
set YourString=This is a test set OtherString=test If NOT "%YourString%"=="%YourString:%%=%" ( echo Yes echo !YourString%OtherString%=! pause ) else ( echo No echo "%YourString:test=%" pause )
正确实现方案
问题出在批处理默认的变量展开时机:普通%var%形式的变量会在整段语句解析阶段就完成展开,不支持嵌套的变量替换逻辑,只要开启延迟变量扩展即可解决,无需冗余代码:
@echo off :: 开启延迟变量扩展 setlocal enabledelayedexpansion set YourString=This is a test set OtherString=test :: 先解析%OtherString%为实际值,再执行替换、对比 if not "!YourString:%OtherString%=!" == "%YourString%" ( echo Yes ) else ( echo No ) endlocal
逻辑说明
- 开启延迟扩展后,用
!包裹的变量会在语句执行阶段才完成展开,刚好适配嵌套变量替换的场景 - 语句执行时会先把
%OtherString%解析为其存储的实际子串内容,再执行字符串替换操作,把原字符串中匹配到的子串替换为空,最后和原字符串做相等判断即可 - 不需要额外加循环、标签跳转之类的冗余逻辑,代码简洁且兼容所有主流Windows版本的cmd环境
内容的提问来源于stack exchange,提问作者Andly Kwan
相关产品推荐
相关产品推荐

