我有一个可以自动运行如下服务器的 bat 文件:
cd %location_1%\target
start java -jar cm-2.0.1.jar
随着新版本的发布,jar 文件的名称将会改变:
- 厘米-2.0.2.jar
- 厘米-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 需要在不同的地方启动才能运行我的应用程序。但它们都有与我的应用程序版本相对应的相同版本号。它们看起来像这样:
- 厘米-2.0.1.jar
- ss-2.0.1.jar
- ab-2.0.1.jar
- 等等
答案1
1.过滤输出以仅获取.jar
以结尾的文件Findstr /eli jar
2.仅定义循环中的第一个项目。
3.定义变量后,goto label :run_jar
并使用你的最后一个文件:
@echo off
:: code before loop ::
cd/d "%location_1%\target"
for /f "delims=" %%i in ('
dir /b/o-d "cm-*.jar"^|findstr/eil jar
')do set "_last_jar=%%~i" && goto :run_jar
:run_jar
start "" /b java -jar "%_last_jar%"
:: code after run your last jar file ::
对于没有定义变量的运行:
@echo off
:: code before loop ::
for /f delims^= %%i in ('
dir /b/o-d "%location_1%\target\cm-*.jar"^|findstr /eil jar
')do start "" /b /d "%%~dpi" java -jar "%~nxi" && goto :eof
或者...
@echo off
:: code before loop ::
for /f delims^= %%i in ('
dir /b /o-d "%location_1%\target\cm-*.jar"^|findstr.exe /eil jar
')do cd/d "%%~dpi" && start "" /b java -jar "%%~fi" && goto :eof
...我怎样才能获取变量中的版本号?
@echo off
:: code before loop ::
cd/d "%location_1%\target"
for /f tokens^=1-3*delims^=-. %%i in ('
dir/b/o-d /a-d "cm-*.jar" ^|findstr.exe /eil jar
')do set "_jar_ver=%%~j.%%~k.%%~nl" && goto:next
:next
echo\cm-%_jar_ver%.jar
:: code after get version ::
// 编辑for (so, on)do...()
1.仅使用文件名称%%~ni
2.删除字符串:*_=
前version.number.s
3.For
在每个(string
+ -
)文件名中使用附加循环:
@echo off
:: code before loop ::
cd/d "%location_1%\target"
for /f delims^= %%i in ('
dir/b/o-d "*-*.jar"^|findstr/eil jar
')do set "_ver=%%~ni" && goto %:next
:next
set "_ver=%_ver:*-=%"
for %%i in (cm,ss,ab,and,so,on
)do if exist "%%~i-%_ver%.*" dir/b "%%~i-%_ver%.*"|findstr /eil jar
:: code after get version ::
- 您也可以替换
if exist ..
为2>nul dir...
@echo off
:: code before loop ::
cd/d "%location_1%\target"
for /f delims^= %%i in ('
dir/b/o-d "*-*.jar"^|findstr/eil jar
')do set "_ver=%%~ni" && goto %:next
:next
set "_ver=%_ver:*-=%"
for %%i in (cm,ss,ab,and,so,on
)do 2>nul dir/b "%%~i-%_ver%.*"|findstr/eil jar
:: code after get version ::
- 或者与
if exist (start)
...
@echo off
:: code before loop ::
set "_file=cm,ss,ab"
cd/d "%location_1%\target"
for /f delims^= %%i in ('
dir/b/o-d "*-*.jar"^|findstr/eil jar
')do set "_ver=%%~ni" && goto %:next
:next
set "_ver=%_ver:*-=%"
for %%i in (%_file%)do if exist "%%~i-%_ver%.jar" (
<con: start "SS" /b java -jar "%%~i-%_ver%.jar" )
:: code after get version ::
答案2
列出文件的裸名称,按日期升序排列并保留最后一个:
cd /D "%location_1%\target"
for /f "tokens=*" %%a in ('dir /A-D /B /O:D cm-*.jar') do set File=%%a
echo %File%
start java -jar "%File%"
答案3
按字母顺序列出文件并使用for /f
循环获取最后一个文件:
cd /d "%location_1%\target"
for /f "delims=" %%a in ('dir /b /on /a-d cm-*.jar') do set "filename=%%a"
start java -jar "%filename%"
编辑 dir
也可能匹配短名称(CM-201~1.JAR
对于cm-2.0.1.jarAnythingElse
。
而且你说The only constant is that there will be only one file that ends with .jar
。
这使得这个任务非常简单(不需要排序任何东西)通过使用where
而不是dir
(where
不考虑短名称):
for /f "delims=" %%a in ('where /r . cm-*.jar') do set "filename=%%a"
echo %filename%
这将为您提供完整限定文件名(包括驱动器、路径、名称和扩展名)。请参阅for /?
,尤其是“修饰符”部分,其中解释了如何获取该 FQFN 的部分内容,例如...do set "filename=%%~nxa"
仅获取文件名加扩展名。
答案4
根据注释中的附加信息,每个不同的 .jar 每次只能有一个匹配的 .jar 文件。有了这个前提条件,就不需要列出所有匹配的文件并找到文件名中修改时间最新或版本号最高的文件。
你可以简单地
cd %location_1%\target
rem If there is no matching file this will do nothing.
rem If there is more than one matching file it will start all of them.
for %%f in ( cm-*.jar ) do start java -jar %%f
有很多方法可以改进这个基本概念,例如添加一些错误检查
cd %location_1%\target
if not exist cm-*.jar goto missing
for %%f in ( cm-*.jar ) do start java -jar %%f
goto eof
:missing
rem do some error reporting or error handling
或者将文件名保存到变量中并在稍后使用。
setlocal
cd %location_1%\target
set cmjar=
rem In case there is more than one matching file, the variable value will be the one found last.
rem If no file was found, the variable value will remain empty.
for %%f in ( cm-*.jar ) do set cmjar=%%f
rem Maybe check for empty value as handle this as an error.
start java -jar %cmjar%
endlocal
编辑作为回应斯蒂芬评论
for %%f in ( cm-*.jar ) do ...
如果启用短名称,可能会产生误报
正如原帖作者在评论中写道“每次只会有一个罐子。“我假设不会有其他 .jar 文件可以通过其短名称或长名称与文件名模式匹配。
如果模式同时匹配短名称和长名称,则循环for
将仅对匹配的文件执行一次,而不是对短名称和长名称执行两次。
为了避免通过匹配短名称而产生误报,可以将模式更改为包含两个或三个点,因为短名称不会包含超过一个点。
例子:
for %%f in ( cm-*.*.jar ) do start java -jar %%f
将匹配例如
cm-1.2.3.jar
但不是像
CM-123~1.JAR
为了避免通过匹配短文件名而可能出现的误报,请将上面代码片段中的所有模式更改cm-*.jar
为cm-*.*.jar
或。cm-*.*.*.jar