2017-06-20 13 views
0

Visual StudioでSQLpackage.exeプロンプトを実行して、自動化プロセスを支援しようとしています。私はコマンドプロンプトで文字列をテストし、正常に実行されます。私はVS17を介してそれを実行すると私は開く/閉じると何も起こらないプロンプトを取得します。この仕事をするために私は何ができますか?ただ、明確化のためVisual Studioで、引用符付きの引数を使用してCMD.exeプロンプトを実行します。

、私は次のようになり、コマンドラインで使用したい文字列:コンソールに出力

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage" /a:PUBLISH /sf:"C:\targetdacpac.dacpac" /tsn:"(local)\SQL2016" /tdn:"DBtargpath"

そして、私の文字列を使用して:

Console.WriteLine(@"""C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage"" /a:PUBLISH /sf:""C:\targetdacpac.dacpac"" /tsn:""(local)\SQL2016"" /tdn:""DBtargpath""");

返信:

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage" /a:PUBLISH /sf:"C:\targetdacpac.dacpac" /tsn:"(local)\SQL2016" /tdn:"DBtargpath"

私のコードは以下に添付されています。私はVSを介してコマンドライン引数を実行することにあまり慣れていませんが、私は非常に多くの文字列リテラルが含まれているので、私のケースは非常にユニークであることを知るために十分な研究を行ってきました。

System.Diagnostics.Process process = new System.Diagnostics.Process(); 

     try { 
      ProcessStartInfo startInfo = new ProcessStartInfo("CMD.EXE"); 
      startInfo.WindowStyle = ProcessWindowStyle.Normal; 

      startInfo.Arguments = @"""C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage"" /a:PUBLISH /sf:""C:\targetdacpac.dacpac"" /tsn:""(local)\SQL2016"" /tdn:""DBtargpath"""; 

      Process.Start(startInfo); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 

EDIT:ファイルパスのスペースのためにエラーが発生しているようです。複数の文字列リテラルを送信すると、正しく動作しません。私は掘り続けます。

答えて

0

私は多くの日に自分自身の問題を解決したテストの私はまだ私の元の問題に直接解決策がありませんでしたが、.batでコマンドをコンパイルするだけで動作する解決策です。

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage" /a:PUBLISH /sf:"C:\targetdacpac.dacpac" /tsn:"(local)\SQL2016" /tdn:"DBtargpath" PAUSE

一時停止は、あなたがそれを必要としない場合はそれを削除開放端子を保持します。私はテスト目的のために使用したので、出力を確認して、コマンドが正常に動作していることを確認できました。代わりにProcessStartInfo( "CMD.EXE")を指定する

try 
{ 
    ProcessStartInfo processStart = new ProcessStartInfo("Cmd.exe") 
    { 
     UseShellExecute = false, 
     RedirectStandardInput = true, //shows output in VS 
     Arguments = @"/k C:\DacPacs\runcmd.bat" 
    }; 
    Process process = new Process() { StartInfo = processStart }; 

    process.Start(); 

} 
catch (Exception e) 
{ 
     Console.WriteLine(e.Message); 
} 
0

は単なる文字列の一部である引用符の前にバックスラッシュを入れて、あなたが行く最後に

startInfo.Arguments = "This \" is ok"; 

することになります。これは、「大丈夫ですできるようになりますパラメータ

+0

@記号で文字列リテラルを使用している場合は、正しい文字列が使用されます。なぜ端末が何もしないのか分かりません。私は格納されている文字列と正しいものを出力しました。引用符の前にスラッシュを置くと、@を取り除く必要があります。私は両方の方法を正直に試しました。多分、私はどこかでうんざりしました。 – Stephen

0

、どのようにProcessStartInfoについて( "@ C:\プログラムファイルのMicrosoftのVisual Studio 14.0 \ Common7 \ IDE \拡張\マイクロソフト\ SQLDB \ DAC \(x86の) \ 140 \ SqlPackage.exe ")?

代わりに、Microsoft.SqlServer.Dac APIを直接使用することもできます。 NuGetパッケージはここにあります:https://www.nuget.org/packages/Microsoft.SqlServer.DacFx.x64

関連する問題