2010-11-21 6 views
16

Я пытаюсь заставить MSDeploy выполнить сценарий PowerShell на удаленном сервере. Это, как я исполняю 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. 

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

+0

любое окончательное решение с полным исходным кодом об этом? – Kiquenet

ответ

20

Ваш сценарий и проблема похожи на сообщения об этой проблеме: PowerShell.exe can hang if STDIN is redirected

Если это так, то попробуйте этот обходной путь: использовать -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 таким же или похожим образом, то, надеюсь, это решение.

+1

-внешний формат никто не решал проблему! Благодаря! –

+1

В соответствии с Powershell 2.0 и 3.0 [документация] (http://technet.microsoft.com/en-us/library/hh847736.aspx) 'None' не является допустимым аргументом' -InputFormat', поэтому это обходное решение может быть опираясь на неопределенное поведение. –

2
powershell.exe -file ScriptFile.ps < CON 

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

+2

Что это на самом деле? – Doug

 Смежные вопросы

  • Нет связанных вопросов^_^