参考:
官网文档
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版本执行