使用带引号的参数通过Visual Studio运行CMD.exe提示符

时间:2017-06-20 22:06:22

标签: c# visual-studio cmd visual-studio-2017

我正在尝试通过visual studio运行SQLpackage.exe提示,以帮助实现自动化过程。我在命令提示符下测试了字符串,它运行正常。当我通过VS17运行它时,我得到一个打开/关闭的提示,没有任何反应。我能做些什么才能做到这一点?

为了澄清,我希望在命令行中使用的字符串应如下所示:

"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);
        }
编辑:由于文件路径中的间距,看起来我收到错误。发送多个字符串文字时,它无法正常工作。我会继续挖掘。

3 个答案:

答案 0 :(得分:0)

只需在作为字符串一部分的引号前加一个反斜杠,就可以了。

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

最后

  

这"没关系

将是参数

答案 1 :(得分: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);
}

答案 2 :(得分:0)

而不是指定ProcessStartInfo(“cmd.exe”),而不是ProcessStartInfo(@“C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ Extensions \ Microsoft \ SQLDB \ DAC \ 140 \ SqlPackage .EXE“)?

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