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