MSDEPLOY с использованием CMD со скриптом C# в Visual Studio - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь выполнить команду msdeploy.exe, используя cmd из Visual Studio с c# в качестве языка сценариев

 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`""""";

Понятия не имею, где я ошибаюсь.

1 Ответ

1 голос
/ 30 января 2020

Вы используете знак равенства, где он должен быть двоеточием.

Это должно быть -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

Как узнать, какая версия webdeploy / msdeploy установлена ​​в настоящее время?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...