Nant, переключатель SqlCmd -v и пробелы в свойстве nant завершаются неудачно с неверным аргументом - PullRequest
1 голос
/ 09 ноября 2009

У меня есть скрипт 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 в историю построения версий журналирования таблицы для схемы БД.

Кто-нибудь знает альтернативный метод или знает способ через это?

Следующая часть, добавленная после того, как Филипп Кили правильно решил первую часть ( ПРОБЕЛ * ) Я упростил исходное задание, чтобы упростить вопрос.

Существует также Проблема цитируемых атрибутов ; Атрибуты 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 Ответ

2 голосов
/ 09 ноября 2009

Ваша проблема (конечно) в линии

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

Пожалуйста, попробуйте это и посмотрите - возможно, мне придется сделать что-то подобное в ближайшее время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...