Nant,SqlCmd -v开关和nant属性中的空格无法使用无效参数构建

时间:2009-11-09 15:06:21

标签: nant arguments sqlcmd

我有一个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>

任何想法......?

1 个答案:

答案 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宏替换(我很可能将这些概念的正式标题错误)用于那些嵌入式引号。该值应为

&quot;

这意味着以下内容应该有效:

<exec program="${SqlCmd}" commandline="-S ${SqlServerInstanceName} -E -d HBus -i ${SqlBuildScriptsDir}${sqlBuildFileName} -v vSchemaVersion=&quot;${buildHistoryContents}&quot;  " />

请试试这个,看看 - 我可能不久就会做这样的事情。