如何通过批处理文件创建条件子文件夹?

时间:2017-02-01 06:45:54

标签: windows batch-file jenkins

我们使用Jenkins作为CI工具。目前,我编写了一个批处理文件,它从记事本文件(由开发人员编写)获取构建值,然后将其复制到网络驱动器,并将构建值作为文件夹。

批处理文件如下所述

    for /f "tokens=2" %%i in ('findstr Build "C:\Program Files (x86)\Jenkins\jobs\**\build.txt"') do set Build=%%i
    set Build=%Build:'=%

if not exist "\%Build%\" mkdir "%Build%\"

我现在的动机是,如果记事本中的值是6.1或6.a,即十进制之后的任何值,它不会创建文件夹,而是将其放在6子文件夹中。或者,如果值已满,则会创建父文件夹。

我得到内部版本号的文本文件如下所示。

#define MyAppVersion '4.0.0.0'
#define MyFullAppVersion '4.1.0.0'
#define BuildNumber '81'

我需要根据“Build Number”中输入的值创建文件夹。如果值是十进制的,它应该在子文件夹中创建,否则应该只有一个主文件夹。

在以下输入的帮助下,我创建了下面的批处理文件来实现这一点,但它没有用。

for /f "tokens=2" %%i in ('findstr Build "C:\Folder Check\logs\build.txt"') do set Build=%%i
set Build=%Build:'=%

for /F "tokens=2""delims=." %%j in ('findstr Build "C:\Folder Check\logs\build.txt"') do set "sub=%%j"

if exist "\\network\%Version%\%Build%\" mkdir "\\network\%Build%\%sub%%"

if not exist "\\network\%Version%\%Build%\" mkdir "\\network\%Version%\%Build%\"

if exist "\\network\%Version%\%Build%\%sub%%j" XCOPY /y "C:\Program Files (x86)\Notepad++\readme.txt" "\\network\%Version%\%Build%\%sub%\" /E /S

if not exist "\\172.19.0.4\Departement$\Development\Development RCX\RCX_M02_CSP\INTERNAL RELEASES\CI\%Version%\%Build%\%sub%%" XCOPY /y "C:\Program Files (x86)\Notepad++\readme.txt" "\\network\%Version%\%Build%\" /E /S

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以使用以下代码拆分句点.以及后面的所有内容:

for /F "delims=." %%j in ("%Build%") do set "Build=%%j"

另请参阅引用的set语法,这是我一般推荐的语法,因为没有特殊字符可能会导致问题。

您的if exist语法对我来说有点奇怪;我不确定目录%Build%应该位于何处,因为您在存在检查期间位于\之前,但在创建期间不会。如果要确保当前工作目录中存在该目录,请不要在\

之前
if not exist "%Build%\" mkdir "%Build%"

如果你想让它位于当前驱动器的根目录中,那么请先按\进行,但我想这不是你想要的。

但是,需要追加 \来检查目录是否存在;不提供它也会检查文件。

无论如何,为了确保目录存在,您不需要检查是否存在,您只需创建它并禁止出现该目录已存在的错误消息,如下所示:

mkdir "%Build%" 2> nul

我不确定我是否正确解释了你的路径规范中的**,但我认为你会让我知道......

您只能在路径的 last 元素中使用全局通配符(*?),因此C:\Program Files (x86)\Jenkins\jobs\**\build.txt无效。如果C:\Program Files (x86)\Jenkins\jobs\中只有一个目录,您可以这样:

for /D %%D in ("C:\Program Files (x86)\Jenkins\jobs\*") do set "SubDir=%%~D"

如果有多个目录并且您想获得最后一个目录,可以使用:

for /F "eol=: delims=" %%D in ('
    dir /B /A:D /O:D "C:\Program Files (x86)\Jenkins\jobs\*"
') do set "SubDir=%%D"