AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1648156
Accepted
Travis Heeter
Travis Heeter
Asked: 2021-05-11 11:00:48 +0800 CST2021-05-11 11:00:48 +0800 CST 2021-05-11 11:00:48 +0800 CST

如何从文件名中获取数字以在 cmd 中使用?

  • 772

我有一个 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
  • 等等
windows command-line
  • 4 4 个回答
  • 664 Views

4 个回答

  • Voted
  1. Best Answer
    Io-oI
    2021-05-11T17:11:31+08:002021-05-11T17:11:31+08:00

    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 ::
    • 1
  2. Stephan
    2021-05-11T12:08:03+08:002021-05-11T12:08:03+08:00

    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%"
    

    EDIT dir也可能匹配短名称(CM-201~1.JARfor cm-2.0.1.jarAnythingElse。
    你说The only constant is that there will be only one file that ends with .jar。通过使用而不是(不考虑短名称)
    ,这使得这项任务非常简单(不需要对任何东西进行排序):wheredirwhere

    for /f "delims=" %%a in ('where /r . cm-*.jar') do set "filename=%%a"
    echo %filename%
    

    这将为您提供完整的限定文件名(包括驱动器、路径、名称和扩展名)。请参阅for /?,尤其是“修改器”部分,它解释了如何仅获取该 FQFN 的一部分,例如...do set "filename=%%~nxa"仅获取文件名和扩展名。

    • 0
  3. harrymc
    2021-05-11T12:28:55+08:002021-05-11T12:28:55+08:00

    列出文件的裸名,按日期升序排列并保留最后一个:

    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%"
    
    • 0
  4. Bodo
    2021-05-15T06:41:29+08:002021-05-15T06:41:29+08:00

    根据评论中的附加信息,每个不同的 .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
    

    编辑作为对Stephan的评论的回应

    for %%f in ( cm-*.jar ) do ...
    

    如果启用短名称,可能会出现误报

    正如 OP 在评论中所写的那样“一次只会有一个 jar。 ”我认为不会有一个不同的 .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其中的代码片段。

    • 0

相关问题

  • Python 的“pass”参数的批处理等价物是什么?

  • 禁用后无法启用 Microsoft Print to PDF

  • 在 Windows 上与 Docker 守护进程通信

  • 资源管理器侧面板中的桌面外壳快捷方式

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve