将 osql 与 nant 脚本一起使用

Posted

技术标签:

【中文标题】将 osql 与 nant 脚本一起使用【英文标题】:Using osql with nant scripts 【发布时间】:2008-11-21 14:57:15 【问题描述】:

我目前通过调用带有参数的批处理文件来使用 osql 和 nant。以下是我的 nant 脚本中定义的属性(不,不是真实的用户名/密码值):

<property name="project.config" value="debug" />
<property name="server" value="(local)" />
<property name="database" value="Test" />
<property name="username" value="sa" />
<property name="password" value="password" />

然后我根据用户名/密码创建 osql 连接:

<if test="$username==''">
  <property name="osql.connection" value="-E" />
</if>
<if test="$username!=''">
  <property name="osql.connection" value="-U $username -P $password" />
</if>

然后我将这些值传递到我的批处理文件中:

<exec program="setup.bat">
   <arg value="$server"/>
   <arg value="$database" />
   <arg value="$osql.connection" />
</exec>

setup.bat 文件使用 osql 删除数据库:

osql -S %1 -d master %3 -Q "IF EXISTS (SELECT * FROM sysdatabases WHERE name = N'%2') DROP DATABASE [%2]"

如果我不将用户名/密码传递给 nant 脚本并改用集成安全性(“-E”到 osql),这可以正常工作。如果我确实指定了用户名/密码,那么 nant 脚本就会暂停(就像它正在等待一些输入一样)。我知道我指定了正确的用户名/密码,因为我可以登录 SQL 连接管理器并删除数据库。

如果对尝试什么或替代方法有任何建议,请告诉我。

【问题讨论】:

【参考方案1】:

这里有一些建议

    为了帮助诊断 nant/batch 脚本的问题,回显正在执行的完整 osql 命令(来自批处理脚本)会很有帮助。这当然是为了确保在提供用户名/密码时正确扩展 osql.connection。 您使用我们不知道的批处理脚本可能还有其他原因。但是,为了帮助诊断问题,您可以使用exec 任务直接将 osql.exe 作为程序传入。同样,这只是为了直接使用 osql.exe 将批处理脚本取出来看看它是否有效。此外,您还可以使用 echo 任务在执行之前回显整个命令字符串。 对于完全不同的方法,您可以尝试sql 任务,它是NAntContrib 分发的一部分。很多时候,它是 osql.exe 的一个非常好的替代品。

也许通过尝试其中一些方法,您将能够缩小确切发生的范围。将您的发现发布在 cmets 中,我很乐意提供帮助。

【讨论】:

问题出在 osql 文件而不是 exec,因为我已经分别运行它们并检索到相同的错误。 OSQL 被回应为 osql -S (local) -d Test "-U sa -P password" -Q "....." 这似乎不起作用。我将查看 sql 任务。谢谢!【参考方案2】:

我认为您可能想尝试使用参数的顺序...我似乎记得过去被 OSQL 对参数顺序的敏感性所困扰。

这就是我现在所拥有的一切......对不起。

【讨论】:

【参考方案3】:

我猜 %3 只扩展为“-U”。

这个可以解决

SET Server=%1
SET Database=%2
SHIFT 
SHIFT
osql -S %Server% ... %* -Q "...%Database%..."

或将属性值设置为包含双引号。

评论后更新:

请参阅this article,了解如何从 shell 变量中删除引号,并将其应用于第三个参数。

【讨论】:

我已经尝试了上述建议(SHIFT 方法和双引号,似乎都不起作用。OSQL 被回显为 osql -S (local) -d Test "-U sa - P密码”-Q“.....”

以上是关于将 osql 与 nant 脚本一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 nant 脚本创建 svn 分支?

如何使用 nant 脚本解压缩文件? Nant 解压缩任务显示一些错误?

检查 NAnt 脚本中的 NAnt 版本

NANT 复制所有具有相似名称的文件

NAnt、MbUnit、CruiseControl、Selenium - 将设置传递给测试程序集

关于使用 NAnt 创建和部署最小化 JavaScript 的建议?