我有一个nant脚本...... 1.获取光盘文件的内容 2.将该内容分配给nant属性 3.然后调用sqlcmd,并在-v中传入包含光盘文件内容的属性 4.在sql脚本中,文件的内容应该由存储过程使用。
问题是,当文件内容包含空格时,nant构建会因“无效参数”问题而停止
有人知道解决这个问题吗?
nant脚本的顶部是......
<?xml version="1.0"?>
<!-- the main name of this project -->
<project name="Hops" default="all">
<!-- BuildHistory -->
<property name="buildHistoryContents" value="" />
<xmlpeek xpath="/" file="BuildNotes.xml" property="buildHistoryContents"></xmlpeek>
<!-- <echo message="${buildHistoryContents}" /> -->
<!-- ***************** -->
<target name="ExecSql">
<echo message="running sql script : ${SqlBuildScriptsDir}${sqlBuildFileName}" />
<exec program="${SqlCmd}" commandline="-S ${SqlServerInstanceName} -E -d HBus -i ${SqlBuildScriptsDir}${sqlBuildFileName} -v vSchemaVersion=${buildHistoryContents} " />
</target>
sql脚本包含行...
exec lsp_SchemaVersionUpsert '1.4', N'$(vSchemaVersion)'
有效的光盘文件内容是......
<BuildNotes>
<Note>
<buildVer>HasNotSpace</buildVer>
</Note>
</BuildNotes>
无效的光盘文件内容是......
<BuildNotes>
<Note>
<buildVer>Has Space</buildVer>
</Note>
</BuildNotes>
使用所有这些是将xml构建注释传递给db模式的表日志版本构建历史记录。
有没有人知道另一种方法或知道这种方法?
下一部分,在Phillip Keeley正确解决第一部分( SPACE问题)之后添加 我简化了原始任务以简化问题。
还有引用属性问题; xml引用的属性导致nant构建失败并显示“无效参数”。
例如,这会导致nant无法阻塞,但删除dt属性将使nant构建成功...
<BuildNotes>
<Note>
<buildVer>1.4</buildVer>
<dateStarted>09/24/2009 11:25:42</dateStarted>
<Item dt="20091008" >SpacesAndNoQuotedAttribute</Item>
</Note>
</BuildNotes>
任何想法......?
答案 0 :(得分:2)
您的问题(当然)在行
<exec program="${SqlCmd}" commandline="-S ${SqlServerInstanceName} -E -d HBus -i ${SqlBuildScriptsDir}${sqlBuildFileName} -v vSchemaVersion=${buildHistoryContents} " />
具体而言,
-v vSchemaVersion=${buildHistoryContents}
NAnt表达式用存储的值替换属性$ {buildHistoryContents} - 它将包含任何嵌入的空格。问题是,当从命令窗口调用SQLCMD(我假设那是$ {SqlCmd}解析到的)时,任何和所有-v参数的值都是空格分隔的 - 也就是说,解析器命中-v,读取接下来的字符通过“=”作为变量名,然后读取=之后的所有字符,并通过下一个空格(或行尾)作为赋值给变量的值,嵌入的空间会使你陷入困境。 / p>
在命令行中,解决方法是将变量值包装在引号中:
- v MyVariable=Hello World
变为
- v MyVariable="Hello World"
这在这里不起作用,因为它是XML,你必须用引号包装 exec 元素的命令行属性...并且嵌入式引号将一次再一次,搞砸了你。
我认为这里的解决方法是使用XML宏替换(我很可能将这些概念的正式标题错误)用于那些嵌入式引号。该值应为
"
这意味着以下内容应该有效:
<exec program="${SqlCmd}" commandline="-S ${SqlServerInstanceName} -E -d HBus -i ${SqlBuildScriptsDir}${sqlBuildFileName} -v vSchemaVersion="${buildHistoryContents}" " />
请试试这个,看看 - 我可能不久就会做这样的事情。