Nant, commutateur de SQLCMD et des espaces dans la propriété ne Nant construire avec argument invalide

StackOverflow https://stackoverflow.com/questions/1701603

  •  19-09-2019
  •  | 
  •  

Question

J'ai un script qui ... Nant 1. prend le contenu du disque fichier 2. attribue ce contenu à une propriété de Nant 3. puis appelle sqlcmd avec un passage -v dans cette propriété containg le contenu du fichier de disque 4. A l'intérieur du script sql le contenu du fichier doit être utilisé par un proc stocké.

Le problème est que lorsque le contenu du fichier contient un espace de la construction nante arrête avec un problème « argument non valide »

Anone savoir un moyen de contourner cela?

La partie supérieure du script est ... 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>

Le script SQL contient la ligne ...

exec lsp_SchemaVersionUpsert '1.4', N'$(vSchemaVersion)'

Un contenu du fichier de disque qui fonctionne est ...

<BuildNotes>
  <Note>
    <buildVer>HasNotSpace</buildVer>
  </Note>
</BuildNotes>

Un contenu du fichier de disque qui ne fonctionne pas est ...

<BuildNotes>
  <Note>
    <buildVer>Has Space</buildVer>
  </Note>
</BuildNotes>

L'utilisation de tout cela est passe xml construire des commentaires à une version de journalisation de la table construire l'histoire pour le schéma db.

Quelqu'un sait-il une autre méthode ou de savoir un chemin à travers cela?

La partie suivante, a ajouté après Phillip Keeley correcty résolu première partie ( ESPACE problème ) J'ai simplifié la tâche originale de simplifier la question.

Il y a aussi un Cité Attribute Problème ; attributs cité xml provoquent l'accumulation nante à l'échec avec « Argument non valide ».

par exemple, cela entraînera à étouffer, mais Nant retirer l'attribut dt permettra la construction nante pour réussir ...

<BuildNotes>
  <Note>
    <buildVer>1.4</buildVer>
    <dateStarted>09/24/2009 11:25:42</dateStarted>
    <Item dt="20091008" >SpacesAndNoQuotedAttribute</Item>
  </Note>
</BuildNotes>

Toutes les idées ...?

Était-ce utile?

La solution

Votre problème est (bien sûr) en ligne

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

spécifiquement, dans

-v vSchemaVersion=${buildHistoryContents}

L'expression NAnt remplace la propriété $ {} buildHistoryContents avec la valeur stockée - qui comprendra des espaces. Le problème est, lorsque vous appelez SQLCMD (I "m suppose que ce que $ {} SQLCMD décide de) à partir d'une fenêtre de commande, les valeurs pour tout et tous les paramètres sont -v espace délimité - à savoir, l'analyseur frappe -v, lit le les caractères suivants à travers les « = » comme le nom de la variable, puis lit tous les caractères après = et par l'espace suivant (ou à la fin de la ligne) comme la valeur à attribuer à la variable, et que l'espace intégré vous gâchera bigtime.

Sur la ligne de commande, le travail autour est d'envelopper la valeur de la variable entre guillemets:

 - v MyVariable=Hello World

devient

 - v MyVariable="Hello World"

Cela ne fonctionne pas ici, car il est XML et vous devez envelopper commandline attribut du exec élément avec des citations ... et citations EMBEDDED, une fois à nouveau, mess vous bigtime.

Je crois que le travail autour est ici d'utiliser la substitution macro XML (j'ai tout à fait peut-être les titres officiels de ces concepts faux) pour ces citations intégrées. Cette valeur doit être

&quot;

Ce qui signifie que les éléments suivants devraient fonctionner:

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

S'il vous plaît essayer et de voir - je dois faire quelque chose comme ça un jour bientôt moi-même

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top