我有一个 bat 文件可以自动运行这样的服务器:
cd %location_1%\target
start java -jar cm-2.0.1.jar
新版本的 jar 文件的名称将更改:
- cm-2.0.2.jar
- cm-2.0.3.jar
如何更改我的 bat 以自动运行 jar 文件?
我的想法是在文件名中创建一个包含版本号的变量,然后使用该变量运行它,如下所示:
cd %location_1%\target
copy_file_name > version_number (only the version number)
start java -jar cm-%version_number%.jar
但我不知道该怎么做。
编辑:
我得到了一些依赖于文件名字母顺序的答案。不幸的是,这里还有其他文件,是从构建过程中自动生成的,例如cm-2.0.1.jar.original
,所以我认为这不会永久有效。
唯一不变的是只有一个以 . 结尾的文件.jar
。
有没有办法只针对以 结尾的文件.jar
?
编辑2:
我意识到我的问题具有误导性。原来,我问“如何获取最新的文件在cmd中使用?” 我的意思是基于文件名中的版本号的最新版本,而不是每个人都将其视为“创建的最新文件”的方式。我已更改问题以更准确地显示这一点。带来不便敬请谅解。
编辑3:
有人问为什么不直接使用文件名,为什么需要数字出来呢?
答案是因为我需要在不同的地方启动几个 jar 来运行我的应用程序。但它们都具有与我的应用程序版本对应的相同版本号。它们看起来像这样:
- cm-2.0.1.jar
- ss-2.0.1.jar
- ab-2.0.1.jar
- 等等
1.过滤输出以仅获取以 结尾的文件
.jar
,使用Findstr /eli jar
2.只定义循环中的第一项。
3.定义你的变量后,
goto label :run_jar
并使用你的最后一个文件:对于没有定义变量的运行:
或者...
// 编辑
for (so, on)do...()
1.只使用文件名
%%~ni
2.
:*_=
删除之前的字符串version.number.s
3.在每个 ( + ) 文件名中使用附加
For
循环:string
-
if exist ..
为2>nul dir...
if exist (start)
...for /f
按字母顺序列出文件并通过循环获取最后一个文件:EDIT
dir
也可能匹配短名称(CM-201~1.JAR
forcm-2.0.1.jarAnythingElse
。你说
The only constant is that there will be only one file that ends with .jar
。通过使用而不是(不考虑短名称),这使得这项任务非常简单(不需要对任何东西进行排序):
where
dir
where
这将为您提供完整的限定文件名(包括驱动器、路径、名称和扩展名)。请参阅
for /?
,尤其是“修改器”部分,它解释了如何仅获取该 FQFN 的一部分,例如...do set "filename=%%~nxa"
仅获取文件名和扩展名。列出文件的裸名,按日期升序排列并保留最后一个:
根据评论中的附加信息,每个不同的 .jar 一次只有一个匹配的 .jar 文件。有了这个前提条件,就不必列出所有匹配的文件并找到文件名中修改时间最新或版本号最高的文件。
你可以做到这一点很简单
有很多方法可以改进这个基本概念,例如添加一些错误检查
或将文件名保存到变量中并稍后使用。
编辑作为对Stephan的评论的回应
正如 OP 在评论中所写的那样“一次只会有一个 jar。 ”我认为不会有一个不同的 .jar 文件可以通过短名称或长名称匹配文件名模式。
如果模式同时匹配短名称和长名称,则
for
循环将只对匹配文件执行一次,而不是短名称和长名称都执行两次。为了避免通过匹配短名称获得误报,可以将模式更改为包含两个或三个点,因为短名称不会包含超过一个点。
例子:
将匹配例如
但不是像这样的短名称
要通过匹配短文件名来避免可能的误报,请将所有模式更改
cm-*.jar
为上面的代码片段cm-*.*.jar
或cm-*.*.*.jar
其中的代码片段。