2017-06-20 39 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); 
     } 

编辑:它看起来像我得到一个错误,因为文件路径中的间距。发送多个字符串时,它不能正常工作。我会继续挖掘。

回答

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

暂停保持终端打开,以便将其删除,如果你不需要它。我用它来测试,所以我可以看到输出并确保我的命令正常工作。

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( “CMD.EXE”)的,怎么样的ProcessStartInfo(@“C:\ Program Files文件(x86)的\微软的Visual Studio 14.0 \ Common7 \ IDE \扩展\微软\ SQLDB \ DAC \ 140 \ SqlPackage.exe“)?

或者,您也可以直接使用Microsoft.SqlServer.Dac API。 NuGet包在这里:https://www.nuget.org/packages/Microsoft.SqlServer.DacFx.x64