Запуск PowerShell из команды запуска MSdeploy не завершается

Я пытаюсь заставить MSDeploy выполнить сценарий PowerShell на удаленном сервере. Вот как я запускаю MSDeploy:

msdeploy \
  -verb:sync \ 
  -source:runCommand='C:\temp\HelloWorld.bat', \
  waitInterval=15000,waitAttempts=1 \
  -dest:auto,computername=$WebDeployService$Credentials -verbose

HelloWorld.bat содержит:

echo "Hello world!"
powershell.exe C:\temp\WebDeploy\Package\HelloWorld.ps1
echo "Done"

HelloWorld.ps1 содержит только:

Write-Host "Hello world from PowerShell!"

Однако похоже, что PowerShell никогда не останавливается. Это результат запуска msdeploy:

Verbose: Performing synchronization pass #1.
Verbose: Source runCommand (C:\temp\HelloWorld.bat) does not match destination (C:\temp\HelloWorld.bat) differing in attributes (isSource['True','False']). Update pending.
Info: Updating runCommand (C:\temp\HelloWorld.bat).
Info:

Info: C:\temp>echo "Hello world!"
"Hello world!"

C:\temp\WebDeploy>powershell.exe C:\temp\HelloWorld.ps1

Info: Hello world from Powershell!
Info:

Warning: The process 'C:\Windows\system32\cmd.exe' (command line '/c "C:\Users\peter\AppData\Local\Temp\gaskgh55.b2q.bat
"') is still running. Waiting for 15000 ms (attempt 1 of 1).
Error: The process 'C:\Windows\system32\cmd.exe' (command line '/c "C:\Users\peter\AppData\Local\Temp\gaskgh55.b2q.bat"'
) was terminated because it exceeded the wait time.
Error count: 1.

Кто-нибудь знает решение?


person Peter Moberg    schedule 21.11.2010    source источник
comment
любое окончательное решение с полным исходным кодом об этом?   -  person Kiquenet    schedule 31.07.2012


Ответы (2)


Ваш сценарий и проблема похожи на описанную проблему: PowerShell.exe может зависнуть при перенаправлении STDIN

Если это так, попробуйте этот обходной путь: используйте -inputformat none:

powershell.exe -inputformat none C:\temp\WebDeploy\Package\HelloWorld.ps1

Я пробовал это с помощью «поддельной программы msdeploy», которая вызывает файл .bat следующим образом:

using System.Diagnostics;
class Program
{
    static void Main(string[] args)
    {
        ProcessStartInfo si = new ProcessStartInfo();
        si.FileName = "cmd.exe";
        si.Arguments = "/c " + args[0];
        si.RedirectStandardInput = true;
        si.UseShellExecute = false;
        var process = Process.Start(si);
        process.WaitForExit();
    }
}

В этой демонстрации есть та же проблема, которую вы описываете, и помогает обходной путь. Если msdeploy вызывает файл .bat таким же или подобным образом, то, надеюсь, это решение.

person Roman Kuzmin    schedule 21.11.2010
comment
Согласно документации Powershell 2.0 и 3.0 None не является допустимым -InputFormat аргумент, поэтому этот обходной путь может полагаться на неопределенное поведение. - person M. Dudley; 14.11.2014

powershell.exe -file ScriptFile.ps < CON

Это решает проблему, не прибегая к недокументированным возможностям.

person Greg B    schedule 17.11.2012
comment
Что это на самом деле делает? - person Doug; 04.08.2013
comment
‹ CON также является недокументированной функцией - person user1433852; 05.07.2015