如何在批处理FOR循环中过滤前缀匹配参数的kubectl Pod名称
Windows批处理实现Kubernetes Pod名称前缀过滤
实现逻辑说明
Windows批处理无原生前缀判断语法,可通过两种方式实现需求:
- 借助系统自带
findstr工具的行首匹配能力实现,代码简洁出错率低,优先推荐 - 通过原生字符串截取比对实现,无额外命令依赖
推荐方案:findstr行首匹配实现
findstr的/b参数用于指定从行首位置开始匹配,直接过滤kubectl输出结果即可,完整代码如下:
@echo off setlocal enabledelayedexpansion set "param_to_filter=%~1" if not defined param_to_filter ( echo 错误:请传入Pod名称前缀作为执行参数 exit /b 1 ) :: 注意for命令内的管道符需要加^转义,避免被批处理提前解析 FOR /F "skip=1" %%I in ('kubectl get pods ^| findstr /b /c:"!param_to_filter!"') DO ( echo %%I ) endlocal
脚本执行时传入svc-bpm-tasks作为参数,就会精准输出所有名称以该字符串开头的Pod,不会匹配到名称中间包含该字符串的条目。
原生字符串截取实现(无额外命令依赖)
如果不想借助findstr,可先计算传入前缀的长度,遍历Pod时截取名称等长前缀做相等判断,完整代码如下:
@echo off setlocal enabledelayedexpansion set "param_to_filter=%~1" if not defined param_to_filter ( echo 错误:请传入Pod名称前缀作为执行参数 exit /b 1 ) :: 计算传入前缀的字符串长度 set "tmp_str=!param_to_filter!" set prefix_len=0 :len_loop if defined tmp_str ( set "tmp_str=!tmp_str:~1!" set /a prefix_len+=1 goto len_loop ) FOR /F "skip=1" %%I in ('kubectl get pods') DO ( set "current_pod=%%I" :: 截取当前Pod名开头等长于前缀的子串 set "current_prefix=!current_pod:~0,%prefix_len%!" if "!current_prefix!"=="!param_to_filter!" echo %%I ) endlocal
注意事项
- 循环内读取实时变量值必须开启
setlocal enabledelayedexpansion,否则会取到循环外定义的固定值,判断逻辑失效 - 字符串截取的起始索引从0开始,
!var:~0,n!表示取变量var从第0位开始长度为n的子串
内容的提问来源于stack exchange,提问作者Jhon Anaya Valiente
相关产品推荐
相关产品推荐

