2017-09-21 70 views
0

我必须从包含发布工件的发布位置确定最新发布版本。以下是文件夹的外观: -批处理脚本获取最新文件夹

1.4 
1.4.1 
1.5 
1.5.1 
1.5.2 
latest 

在上面的示例中,我的脚本应返回1.5.2。发布工程师创建一个名为latest的文件夹,并在其中放入最新版本工件(1.5.2的内容) - 因此我可以轻松复制最新版本。但我的问题是我也想打印版本。这是我的尝试: -

@echo off 

SET Remote="\\path to release location" 
SET newest="" 

for /f %%a in ('dir %Remote% /b /od') do (if NOT %%a=="latest" SET newest=%%a) 

echo %newest% 

这适用于上述示例。但是发布工程师有时会在那里创建一个tmp或其他文件夹(基本上他忘记了清理),并且破坏了我过滤掉“最新”的天真假设。有没有简单的方法来排序以数字开头的文件夹来声明最新版本的版本。

也请建议,如果有解决这个

+3

将dir命令的输出传递给FINDSTR,并给它一个正则表达式来查找带有数字的目录名称。诸如此类的用于findstr:'findstr/r“^ [0-9] [0-9] * \。[0-9] [0-9] *”' – Squashman

+0

只需要释放工程师将标记放置'latest'目录中的发布版本呢! – Compo

+0

谢谢@Squashman - 下面是我想到的:'('dir%cd%/ b/od^| findstr/r“^ [0-9] [0-9] * \中的for/f %% a。 [0-9] [0-9] *“')do(SET newest = %% a)' @Compo:感谢您的提示! – Zakir

回答

1

这并不依赖最新的修改日期实际上是最大的版本号。

@echo off 
setlocal enabledelayedexpansion 
set newest=000000000 
PUSHD \\servername\share\directory 
for /f "delims=" %%G in ('dir /b /ad ^| findstr /r "^[0-9][0-9]*\.[0-9][0-9]*"') do (
    FOR /F "tokens=1-3 delims=." %%H IN ("%%~G") DO (
     SET "node1=000%%H" 
     SET "node1=!node1:~-3!" 
     SET "node2=000%%I" 
     SET "node2=!node2:~-3!" 
     SET "node3=000%%J" 
     SET "node3=!node3:~-3!" 
     IF 1!node1!!node2!!node3! GTR 1!newest! (
      set newest=!node1!!node2!!node3! 
      set newrelease=%%G 
     ) 
    ) 
) 
echo %newrelease% 
POPD 
pause 
+0

感谢ans - 想知道结果与“dir/on”选项 – Zakir

+0

@Zakir的结果是不同的,请在cmd提示符下创建三个目录。将它们命名为1.1,11.1和2.1。然后使用您的DIR命令。你认为11.1会最后使用'DIR/ON'吗? – Squashman

1

发布的解决方案在这里为每@ Squashman的建议的任何更好的主意: -

@echo off 

SET Remote="//Path to release loc" 
SET newest=not set 

for /f %%a in ('dir %Remote% /b /on ^| findstr /r "^[0-9][0-9]*\.[0-9][0-9]*"') do (SET newest=%%a) 

echo %newest% 

注: - 排序顺序/od VS /on是我必须与发布工程师一起商定以保护免受以下情况的影响:修补旧版本不会覆盖最新版本

谢谢大家!

+0

我知道这是一个重复的评论,但最简单的方法涉及工程师,你与谁合作,包括一个文件。该文件可以具有已知大小或扩展名,因为它是名称,或者与发行版有一个已知名称,因为它是单行内容。 – Compo

+0

为什么不把目录名分解成变量,并用if语句测试哪一个是最新的呢? – Squashman

相关问题