1

現在、引数付きのバッチファイルを呼び出して、nant で osql を使用しています。私の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 接続マネージャーにログインしてデータベースを削除できるため、正しいユーザー名/パスワードを指定していることはわかっています。

何を試すか、またはこれを行う別の方法について提案があれば教えてください。

4

3 に答える 3

2

ここにいくつかの提案があります

  1. nant/batch スクリプトの問題を診断するには、実行中の完全な osql コマンドを (バッチ スクリプトから) エコー アウトすると便利です。これはもちろん、ユーザー名/パスが提供されたときに osql.connection が適切に展開されていることを確認するためです。
  2. バッチ スクリプトを使用している理由は他にもあるかもしれませんが、それは私たちには関係ありません。ただし、問題の診断に役立てるために、プログラムとして osql.exe を直接渡すexecタスクを使用できます。繰り返しますが、これはバッチ スクリプトを取り出して、osql.exe を直接使用して動作するかどうかを確認するためのものです。また、これにより、 echoタスクを使用して、実行前にコマンド文字列全体をエコーアウトすることができます。
  3. まったく異なるアプローチとして、 NAntContribディストリビューションの一部であるsqlタスクを試すことができます。多くの場合、osql.exe の非常に優れた代替手段になります。

おそらく、これらのいくつかを試すことで、正確に何が起こっているのかを絞り込むことができるでしょう. 調査結果をコメントに投稿してください。喜んでお手伝いさせていただきます。

于 2008-11-21T15:37:55.683 に答える
0

%3 は「-U」のみに展開されていると思います。

おそらくこれで解決できます

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

または、二重引用符を含むようにプロパティ値を設定します。

コメント後の更新:

シェル変数から引用符を削除し、3 番目のパラメーターに適用する方法については、この記事を参照してください。

于 2008-11-21T15:30:09.523 に答える
0

パラメータの順序を試してみたいと思うかもしれません... パラメータの順序に対するOSQLの感度に過去に噛まれたことを覚えているようです。

私が今持っているのはそれだけです...ごめんなさい。

于 2008-11-21T15:07:57.867 に答える