参考:
官网文档
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/findstr
背景:
1.在编写脚本文件时, 习惯性已升级版本的方式, 保持一个增量迭代
如: 一开始只有1个功能就是 xxx_v1.cmd, 加了功能就是 xxx_v2.cmd
至于为什么不直接在源文件上写, 有时候越高的版本代码量越多, 想回过头看看一开始的版本
问题:
所以遇到的问题就是, 如何实现 自动选择 xxx_v2.cmd 进行自动执行
否则每次都要去选择对应的版本文件
实现思路:
1.用dir /b 打印出目录下的所有文件名
2.用findstr /C:"搜索的关键字" 或者 findstr /V "排除的关键字" 进行过滤
3.用for循环, 版本越高的都是在最后一行
4.使用start 命令 执行 cmd文件
脚本正文:
- :: Date: 2022-09-09
- :: Version v1.3
- ::
- ::启动 最高版本的 cmd文件
- ::
- ::
- @echo off
-
- echo .....................................................................
- echo .....................................................................
- echo .....................................................................
- echo "start..."
-
-
- :: 保存当前cmd 位置
- set current_path=%cd%
-
- :: 脚本文件的前缀
- set file_prix=xxx_script
- :: 匹配关键字的模式, 根据情况调整
- :: 特定的格式: xxx_script v1.cmd xxx_script v2.cmd
- set query_name_pattern="%file_prix% v"
-
- :: 临时文件位置
- REM set tmp_file=c:\tmp.txt
- set tmp_file=%cd%\tmp_%file_prix%.txt
-
- echo current path: %current_path%
- echo tmp_file: %tmp_file%
- echo file_prix: %file_prix%
- echo query_name_pattern: %query_name_pattern%
- echo ======================= query file name by string: %file_prix%
-
-
- :: findstr的搜索模式 /C: 参考帮助手册/官方文档
- :: 方式1: 连续排除(如 排除 带+加号的, 带_下划线的)
- REM dir /b | findstr /C:%query_name_pattern% |findstr /V "+" |findstr /V "_" > %tmp_file%
-
- :: 方式2 直接命中
- dir /b| findstr /c:%query_name_pattern% > %tmp_file%
-
- type %tmp_file%
-
- echo ======================= start loop...
- ::
- ::文件名 不会出现逗号
- for /f "delims=, tokens=1" %%a in (%tmp_file%) do (
- echo %%a
- set run_path=%current_path%\%%a
- )
- echo ======================= print run file path
- echo "%run_path%"
-
- echo ======================= start cmd file
- start cmd /k "%run_path%"
-
-
- :: 删除临时文件
- echo ======================= del tmp file
- del %tmp_file%
-
- echo "end..."
- echo .....................................................................
- echo .....................................................................
- echo .....................................................................
-
- :: 等3秒
- timeout /t 3
-
- :: 退出cmd窗口
- exit
假设有 xxx_script v1.cmd xxx_script v2.cmd
会自动选择v2版本执行