1

我有一个 nant 脚本,它... 1. 获取光盘文件的内容 2. 将该内容分配给 nant 属性 3. 然后使用 -v 调用 sqlcmd 并传入包含光盘文件内容的属性 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 正确解决第一部分(空间问题)之后添加,我简化了原始任务以简化问题。

还有一个引用属性问题;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>

有任何想法吗 ... ?

4

1 回答 1

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,读取下一个字符通过“=”作为变量名,然后读取 = 之后的所有字符,并通过下一个空格(或行尾)作为分配给变量的值,嵌入的空格会让你大吃一惊。

在命令行上,解决方法是将变量值括在引号中:

 - 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;  " />

请试试这个看看——我可能很快就会自己做这样的事情。

于 2009-11-09T15:34:04.627 回答