【问题标题】:MSDEPLOY using CMD with C# script in Visual Studio在 Visual Studio 中使用 CMD 和 C# 脚本的 MSDEPLOY
【发布时间】:2020-05-15 01:35:53
【问题描述】:

我正在尝试使用 Visual Studio 中的 cmd 以 c# 作为脚本语言执行 msdeploy.exe 命令

 string filename = @"C:\Deploy\Test\Test.zip";
        string servername = @"PADEVSPTAPP";
        string compname = @"IIS Web Application Name";
        string appvalue = @"Test";
        string strCmdText;
        strCmdText = "msdeploy.exe -verb:sync -source:package=" + filename + " -dest=auto,computerName=" + servername + " -setParam=name=" + compname + ",value=" + appvalue + " -allowUntrusted";
        //System.Diagnostics.Process.Start("CMD.exe", strCmdText);
        try
        {
            System.Diagnostics.ProcessStartInfo procStartInfo =
            new System.Diagnostics.ProcessStartInfo("cmd", "/c " + strCmdText);


            procStartInfo.RedirectStandardOutput = true;
            procStartInfo.UseShellExecute = false;

            procStartInfo.CreateNoWindow = true;

            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.StartInfo = procStartInfo;
            proc.Start();

            string result = proc.StandardOutput.ReadToEnd();

            proc.WaitForExit();

            Console.WriteLine(result);



        }
        catch (Exception objException)
        {
            Console.WriteLine(objException.ToString());
        }

字符串结果是

msdeploy.exe -verb:sync -source:package="C:\\Deploy\\Test\\Test.zip"
-dest=auto,computerName="PADEVSPTAPP" -setParam=name="IIS Web Application Name",value="Test" -allowUntrusted

但是由于命令中的\\ 这不起作用。

我应该如何执行这个命令。

我什至尝试过使用 powershell 脚本,但也没有用

string PS_script = @"$msdeploy = ""C:\\Program Files\\IIS\\Microsoft Web Deploy V3\\msdeploy.exe""
                $package = """;
PS_script = PS_script + Row.deployfile;
 PS_script = PS_script + @"""
                    $compname = ""PADEVSPTAPP""
                    $appname = ""IIS Web Application Name""
                    $appvalue = """;
PS_script = PS_script + changetype[0];

 PS_script = PS_script + @"""
            $md = $(""`""{0}`"" -verb:sync -source:package=`""{1}`"" -dest=auto,ComputerName=`""{2}`"" -setParam=name=`""{3}`"",value=`""{4}`"" -allowUntrusted"" -f $msdeploy, $package, $compname, $appname, $appvalue)
            cmd.exe /C ""`""$md`""""";

我不知道我哪里出错了。

【问题讨论】:

    标签: c# visual-studio powershell cmd


    【解决方案1】:

    您在应该是冒号的地方使用了等号。

    应该是-dest: 而不是-dest=

    setParam 相同,应该是-setParam: 而不是-setParam=

    我怀疑你的字符串中实际上并没有双反斜杠\\,如果你通过调试器进行检查,它看起来就像那样——我怀疑这会让你失望。

    由于您的 compname 变量中有空格,因此您需要在参数字符串中使用双引号(最好将所有变量都括起来)。

    还可以尝试直接运行msdeploy.exe,而不是通过cmd.exe /c

    我假设您的 msdeploy.exe 位于 C:\Program Files (x86)\IIS\Microsoft Web Deploy V3

    字符串结果是:

    -verb:sync -source:package="C:\Deploy\Test\Test.zip" -dest:auto,computerName="PADEVSPTAPP" -setParam:name="IIS Web Application Name",value="Test" -allowUntrusted
    

    把它们放在一起:

    string filename = @"C:\Deploy\Test\Test.zip";
    string servername = @"PADEVSPTAPP";
    string compname = @"IIS Web Application Name";
    string appvalue = @"Test";
    string strCmdText;
    strCmdText = "-verb:sync -source:package=\"" + filename + "\" -dest:auto,computerName=\"" + servername + "\" -setParam:name=\"" + compname + "\",value=\"" + appvalue + "\" -allowUntrusted";
    //System.Diagnostics.Process.Start("CMD.exe", strCmdText);
    try
    {
        System.Diagnostics.ProcessStartInfo procStartInfo =
        new System.Diagnostics.ProcessStartInfo(@"C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy.exe");
        procStartInfo.Arguments = strCmdText;
    
    
        procStartInfo.RedirectStandardOutput = true;
        procStartInfo.UseShellExecute = false;
    
        procStartInfo.CreateNoWindow = true;
    
        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.StartInfo = procStartInfo;
        proc.Start();
    
        string result = proc.StandardOutput.ReadToEnd();
    
        proc.WaitForExit();
    
        Console.WriteLine(result);
    
    
    
    }
    catch (Exception objException)
    {
        Console.WriteLine(objException.ToString());
    }
    

    奖励信息

    如果您需要更可靠的方法来确定 msdeploy.exe 的位置,请查看以下链接:

    https://gist.github.com/SergeyAxenov/15cf008531e6d0741533

    How to find out what version of webdeploy/msdeploy is currently installed?

    【讨论】:

    • 谢谢乔纳斯......你的回答就像一个魅力。我还用来自 DB 的值替换了字符串。我所要做的就是将@"C:\Deploy\Test\Test.zip" 更改为""+db.valueabc+""
    猜你喜欢
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多