Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用带引号的参数通过Visual Studio运行CMD.exe提示符_C#_Visual Studio_Cmd_Visual Studio 2017 - Fatal编程技术网

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

C# 使用带引号的参数通过Visual Studio运行CMD.exe提示符,c#,visual-studio,cmd,visual-studio-2017,C#,Visual Studio,Cmd,Visual Studio 2017,我正在尝试通过visual studio运行SQLpackage.exe提示符,以帮助实现自动化过程。我已经在命令提示符下测试了这个字符串,它运行得很好。当我通过VS17运行它时,我会得到一个打开/关闭的提示,但什么也没有发生。我能做些什么来让它工作 为了澄清,我希望在命令行中使用的字符串应如下所示: “C:\ProgramFiles(x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\

我正在尝试通过visual studio运行SQLpackage.exe提示符,以帮助实现自动化过程。我已经在命令提示符下测试了这个字符串,它运行得很好。当我通过VS17运行它时,我会得到一个打开/关闭的提示,但什么也没有发生。我能做些什么来让它工作

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

“C:\ProgramFiles(x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage”/a:PUBLISH/sf:“C:\targetdacpac.dacpac”/tsn:“(本地)\SQL2016”/tdn:“dbtargetpath”

我的字符串通过以下方式输出到控制台:

Console.WriteLine(@“C:\ProgramFiles(x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage”“/a:PUBLISH/sf:“C:\targetdacpac.dacpac”“/tsn:(本地)\SQL2016”“/tdn:“DBTargetPath”“”

返回:

“C:\ProgramFiles(x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage”/a:PUBLISH/sf:“C:\targetdacpac.dacpac”/tsn:“(本地)\SQL2016”/tdn:“dbtargetpath”

我的代码附在下面。我不太熟悉通过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);
        }

编辑:由于文件路径中的间距,我似乎遇到了一个错误。当发送多个字符串文字时,它无法正常工作。我会继续挖

只要在字符串中的引号前加上反斜杠,就可以开始了

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

这“是好的


将是参数

经过几天的测试,我最终解决了自己的问题。我仍然没有直接解决我的原始问题的解决方案,但只需在.bat中编译命令就可以了

“C:\ProgramFiles(x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage”/a:PUBLISH/sf:“C:\targetdacpac.dacpac”/tsn:(本地)\SQL2016”/tdn:“dbtargetpath”
暂停

暂停使终端保持打开状态,因此如果不需要,请将其删除。我将其用于测试目的,以便查看输出并确保命令正常工作

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);
}

除了指定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软件包在这里:

如果我使用带@符号的字符串文字,它将使用正确的字符串。我只是不确定终端为什么不使用它。我已经输出了存储的字符串及其正确的值。如果我在引号之前加上斜杠,那么我会这样做需要移除@。老实说,我已经尝试了两种方法。也许我把某个地方搞砸了。