Unity3d 两个几乎相同的批处理脚本之一出现语法错误:“)&引用;无法在此按语法处理

Unity3d 两个几乎相同的批处理脚本之一出现语法错误:“)&引用;无法在此按语法处理,unity3d,batch-file,jenkins,Unity3d,Batch File,Jenkins,我正在尝试为自动Unity构建设置Jenkins服务器 因此,我写了两个(在我看来)基本相同的批处理脚本 Jenkins使用执行Windows批处理命令步骤作为构建步骤运行这两个脚本 命令:E:\unityiimport.bat 然后,第二个执行Windows批处理命令步骤使用 命令:E:\unityBuild.bat 它们都有相同的开始,因为我需要收集一些文件路径,特别是项目的unity版本。因此,在这两个脚本中,我使用完全相同的方法对项目版本进行解析和字符串拆分。它们之间唯一不同的是,第一个

我正在尝试为自动Unity构建设置Jenkins服务器

因此,我写了两个(在我看来)基本相同的批处理脚本

Jenkins使用
执行Windows批处理命令
步骤作为构建步骤运行这两个脚本

命令:
E:\unityiimport.bat

然后,第二个
执行Windows批处理命令
步骤使用

命令:
E:\unityBuild.bat

它们都有相同的开始,因为我需要收集一些文件路径,特别是项目的unity版本。因此,在这两个脚本中,我使用完全相同的方法对项目版本进行解析和字符串拆分。它们之间唯一不同的是,第一个启动Unity并将一个专用的
unitypackage
(保存下一步要执行的方法)导入到项目中,而第二个启动Unity以执行实际构建(不幸的是,它一次也没用……Unity似乎在导入
unitypackage
之前尝试执行该方法)

但是,第二个脚本总是失败,并出现语法错误

此处无法按语法处理“”


我想要达到的是

  • 读取文件
    %WORKSPACE%\ProjectSettings\ProjectVersion.txt的内容

    SET /p TEST=<%WORKSPACE%\ProjectSettings\ProjectVersion.txt
    
    ECHO。ProjectVersion.txt=%TEST%
    看起来像

    ProjectVersion.txt = m_EditorVersion: 2019.3.4f1
    
  • 字符串拆分,以便仅获取包含版本号的最后一部分

    for %%x in (%TEST::= %) do (
        SET "VALUE=%%x"
        SET "UNITY_VERSION=!VALUE:~0,-2!" 
    )
    
    因此
    %UNITY\u VERSION%
    通常包含例如
    2019.3.4
    。我没有更多的拆分,因为还有两位数的Unity版本,例如
    2018.4.18

  • 上拆分字符串,以便仅获取主要版本号

    for /f "tokens=1,2 delims=." %%a in ("%UNITY_VERSION%") do (
        SET "A=%%a"
        SET "B=%%b"
    )
    SET "UNITY_VERSION=%A%.%B%"
    
    这导致
    %UNITY\u VERSION%
    成为例如
    2019.3

  • 最后,如果存在所需版本,则搜索所有已安装的Unity版本

    set "UNITY_FOLDER="
    for /f "delims=" %%a in ('dir /b E:\Unity\%UNITY_VERSION%*') do (
        set "UNITY_FOLDER=%%a"
    )
    
    在此之后,我们找到了给定版本的有效Unity安装文件夹,或者没有


  • 下面是脚本

    导入(如预期那样工作)

    我认为剩下的不重要,因为正如我在控制台中看到的,它在例如

    ProjectVersion.txt=2019.3.4f1

    此处无法按语法处理“”



    是否有人看到了错误,或者Jenkins是否有什么原因导致第二个脚本因语法错误而失败,即使我认为它们基本相同?

    代码中存在多个小问题,我在下面对批处理文件的建议中逐一解释了这些问题

    根据文件
    ProjectVersion.txt
    中定义的
    UNITY\u版本
    获取
    UNITY\u文件夹
    的任务可以通过使用以下代码更高效地完成:

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    
    if not defined WORKSPACE (
        echo ERROR: Environment variable WORKSPACE is not defined.
        exit /B 1
    )
    
    if not exist "%WORKSPACE%\ProjectSettings\ProjectVersion.txt" (
        echo ERROR: File "%WORKSPACE%\ProjectSettings\ProjectVersion.txt" does not exist.
        exit /B 1
    )
    
    set "UNITY_FOLDER="
    set "UNITY_VERSION="
    for /F "usebackq tokens=2-4 delims=. " %%I in ("%WORKSPACE%\ProjectSettings\ProjectVersion.txt") do (
        if not "%%~K" == "" (
            for /F "delims=abcdef" %%L in ("%%~K") do (
                set "UNITY_VERSION=%%~I.%%~J.%%~L"
                for /D %%M in ("E:\Unity\%%~I.%%~J*") do set "UNITY_FOLDER=%%M"
            )
        )
    )
    
    if not defined UNITY_VERSION (
        echo ERROR: Failed to determine unity version from "%WORKSPACE%\ProjectSettings\ProjectVersion.txt".
        exit /B 1
    )
    if not defined UNITY_FOLDER (
        echo ERROR: Failed to find a folder in "E:\Unity" for unity version %UNITY_VERSION%.
        exit /B 1
    )
    
    echo Found for unity version %UNITY_VERSION% the folder "%UNITY_FOLDER%".
    
    cd /D "%WORKSPACE%" 2>nul
    if errorlevel 1 (
        echo ERROR: Failed to set "%WORKSPACE%" as current folder.
        exit /B
    )
    rem Other commands to execute.
    
    endlocal
    
    setlocal EnableExtensions EnableDelayedExpansion
    set "TEST=m_EditorVersion: 2019.3.4f1"
    for %%x in (%TEST::= %) do (
        SET "VALUE=%%x"
        SET "UNITY_VERSION=!VALUE:~0,-2!" 
    )
    endlocal
    
    此批处理文件首先使用命令SETLOCAL设置此批处理文件所需的执行环境

    接下来通过批处理文件验证环境变量
    WORKSPACE
    是否存在。此环境变量应由Jenkins在此批处理文件之外定义。缺少此重要环境变量的定义时输出错误消息

    然后通过打印错误消息(如果不存在)和退出批处理文件(退出代码为1)检查文本文件是否存在

    如果在批处理文件之外偶然定义,则删除两个环境变量
    UNITY\u FOLDER
    UNITY\u VERSION

    接下来将处理文本文件,该文件应仅包含一个包含感兴趣数据的非空行。否则,在执行其他命令之前,如果第一个子字符串等于
    m_EditorVersion:
    ,则有必要更改代码以同时计算第一个子字符串

    FOR带有选项
    /F
    默认情况下将
    中包含的集合解释为要处理的字符串。但在这种情况下,
    中的字符串应解释为文件的完全限定文件名,该文件的内容应逐行处理。因此,选项
    usebackq
    用于获取所需的文件内容处理行为

    FOR在处理文件内容时始终忽略空行。因此,文本文件顶部是否包含一行或多行空行并不重要

    FOR默认情况下使用普通空格和水平制表符作为字符串分隔符将行拆分为子字符串。如果第一个空格/制表符分隔的字符串在删除所有前导空格/制表符后以分号作为默认的行尾字符开头,则该行也会被忽略,就像空行一样。最后,仅将第一个空格/制表符分隔的字符串分配给指定的循环变量
    I

    此处不需要此默认行处理行为,因为仅将
    m_EditorVersion:
    分配给指定的循环变量
    I
    是不够的。因此,选项
    delims=。
    用于将线拆分为点和空格。选项
    tokens=2-4
    通知FOR第二个空格/点分隔的子字符串
    2019
    应分配给循环变量
    I
    ,第三个空格/点分隔的子字符串
    3
    到下一个循环变量
    J
    ,它是中的下一个字符,第四个空格/点分隔的子字符串
    4f1
    到下一个循环变量
    K

    由于spac的原因,在选项参数字符串的末尾指定
    delims=。
    并将空格字符作为最后一个字符是很重要的
    @ECHO OFF
    CLS
    ECHO.
    
    cd %WORKSPACE%
    
    IF NOT EXIST %WORKSPACE%\ProjectSettings\ProjectVersion.txt (
        EXIT 1
    )
    
    SETLOCAL ENABLEDELAYEDEXPANSION
    
    SET /p TEST=<%WORKSPACE%\ProjectSettings\ProjectVersion.txt
    ECHO. ProjectVersion.txt = %TEST%
    
    REM HERE IT BREAKS! The before echo is the last I see before getting the syntax error
    
    for %%x in (%TEST::= %) do (
        SET "VALUE=%%x"
        SET "UNITY_VERSION=!VALUE:~0,-2!" 
    )
    
    for /f "tokens=1,2 delims=." %%a in ("%UNITY_VERSION%") do (
        SET "A=%%a"
        SET "B=%%b"
    )
    
    SET "UNITY_VERSION=%A%.%B%"
    ECHO. Project Unity Version = %UNITY_VERSION%
    
    set "UNITY_FOLDER="
    for /f "delims=" %%a in ('dir /b E:\Unity\%UNITY_VERSION%*') do (
        set "UNITY_FOLDER=%%a"
    )
    
    IF "%UNITY_FOLDER%"=="" (
        EXIT 1
    )
    
    ECHO. Using Unity Version %UNITY_FOLDER%
    
    ...
    
    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    
    if not defined WORKSPACE (
        echo ERROR: Environment variable WORKSPACE is not defined.
        exit /B 1
    )
    
    if not exist "%WORKSPACE%\ProjectSettings\ProjectVersion.txt" (
        echo ERROR: File "%WORKSPACE%\ProjectSettings\ProjectVersion.txt" does not exist.
        exit /B 1
    )
    
    set "UNITY_FOLDER="
    set "UNITY_VERSION="
    for /F "usebackq tokens=2-4 delims=. " %%I in ("%WORKSPACE%\ProjectSettings\ProjectVersion.txt") do (
        if not "%%~K" == "" (
            for /F "delims=abcdef" %%L in ("%%~K") do (
                set "UNITY_VERSION=%%~I.%%~J.%%~L"
                for /D %%M in ("E:\Unity\%%~I.%%~J*") do set "UNITY_FOLDER=%%M"
            )
        )
    )
    
    if not defined UNITY_VERSION (
        echo ERROR: Failed to determine unity version from "%WORKSPACE%\ProjectSettings\ProjectVersion.txt".
        exit /B 1
    )
    if not defined UNITY_FOLDER (
        echo ERROR: Failed to find a folder in "E:\Unity" for unity version %UNITY_VERSION%.
        exit /B 1
    )
    
    echo Found for unity version %UNITY_VERSION% the folder "%UNITY_FOLDER%".
    
    cd /D "%WORKSPACE%" 2>nul
    if errorlevel 1 (
        echo ERROR: Failed to set "%WORKSPACE%" as current folder.
        exit /B
    )
    rem Other commands to execute.
    
    endlocal
    
    for /F "usebackq tokens=2-4 delims=. " %%I in ("%WORKSPACE%\ProjectSettings\ProjectVersion.txt") do (
        if not "%%~K" == "" (
            for /F "delims=abcdef" %%L in ("%%~K") do set "UNITY_VERSION=%%~I.%%~J.%%~L"
            for /D %%M in ("E:\Unity\%%~I.%%~J*") do set "UNITY_FOLDER=%%M"
        )
    )
    
    for /F "usebackq tokens=2-4 delims=. " %%I in ("%WORKSPACE%\ProjectSettings\ProjectVersion.txt") do (
        if not "%%~J" == "" (
            set "UNITY_VERSION=%%~I.%%~J"
            for /D %%K in ("E:\Unity\%%~I.%%~J*") do set "UNITY_FOLDER=%%K"
        )
    )
    
    cd %WORKSPACE%
    IF NOT EXIST %WORKSPACE%\ProjectSettings\ProjectVersion.txt
    SET /p TEST=<%WORKSPACE%\ProjectSettings\ProjectVersion.txt
    
    cd "%WORKSPACE%"
    IF NOT EXIST "%WORKSPACE%\ProjectSettings\ProjectVersion.txt"
    SET /p TEST=<"%WORKSPACE%\ProjectSettings\ProjectVersion.txt"
    
    IF NOT EXIST %WORKSPACE%\ProjectSettings\ProjectVersion.txt (
        EXIT 1
    )
    
    IF NOT EXIST C:\Temp\ProjectSettings\ProjectVersion.txt (EXIT 1 )
    
    IF NOT EXIST "%WORKSPACE%\ProjectSettings\ProjectVersion.txt" EXIT /B 1
    
    IF NOT EXIST "C:\Temp\ProjectSettings\ProjectVersion.txt" EXIT /B 1
    
    SET /p TEST=<%WORKSPACE%\ProjectSettings\ProjectVersion.txt
    
    setlocal EnableExtensions DisableDelayedExpansion
    
       %~I         - expands %I removing any surrounding quotes (")
       %~fI        - expands %I to a fully qualified path name
       %~dI        - expands %I to a drive letter only
       %~pI        - expands %I to a path only
       %~nI        - expands %I to a file name only
       %~xI        - expands %I to a file extension only
       %~sI        - expanded path contains short names only
       %~aI        - expands %I to file attributes of file
       %~tI        - expands %I to date/time of file
       %~zI        - expands %I to size of file
       %~$PATH:I   - searches the directories listed in the PATH
                      environment variable and expands %I to the
                      fully qualified name of the first one found.
                      If the environment variable name is not
                      defined or the file is not found by the
                      search, then this modifier expands to the
                      empty string
    
       %~dpI       - expands %I to a drive letter and path only
       %~nxI       - expands %I to a file name and extension only
       %~fsI       - expands %I to a full path name with short names only
       %~dp$PATH:I - searches the directories listed in the PATH
                      environment variable for %I and expands to the
                      drive letter and path of the first one found.
       %~ftzaI     - expands %I to a DIR like output line
    
    for %%x in ("1" 2,3;4) do echo %%~xx5 = ?
    
    for %x in ("1" 2,3;4) do @echo %~xx5 = ?
    
    5 = ?
    5 = ?
    5 = ?
    5 = ?
    
    for %%I in ("1" 2,3;4) do echo %%~Ix5 = ?
    
    for %I in ("1" 2,3;4) do @echo %~Ix5 = ?
    
    1x5 = ?
    2x5 = ?
    3x5 = ?
    4x5 = ?
    
    setlocal EnableExtensions EnableDelayedExpansion
    set "TEST=m_EditorVersion: 2019.3.4f1"
    for %%x in (%TEST::= %) do (
        SET "VALUE=%%x"
        SET "UNITY_VERSION=!VALUE:~0,-2!" 
    )
    endlocal
    
    m_EditorVersion: 2019.3.4f1
    
    m_EditorVersion  2019.3.4f1
    
    m_EditorVersion 2019.3.4f1