2010-11-21 24 views
16

J'essaie d'obtenir MSDeploy pour exécuter un script PowerShell sur un serveur distant. Voici comment j'exercerai MSDeploy:L'exécution de PowerShell à partir de la commande MSDEPLOY ne se termine pas

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

HelloWorld.bat contient:

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

Le HelloWorld.ps1 ne contient:

Write-Host "Hello world from PowerShell!" 

Cependant, il semble que PowerShell se termine jamais. Ceci est la sortie de l'exécution de 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. 

Quelqu'un connaît une solution?

+0

une solution finale avec le code source complet à ce sujet? – Kiquenet

Répondre

20

Votre scénario et le problème sont similaires à ce problème signalé: PowerShell.exe can hang if STDIN is redirected

Si tel est le cas essayez cette solution de contournement: utilisez -inputformat none:

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

J'ai essayé avec « un msdeploy faux "programme qui appelle le fichier .bat comme ceci:

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

Cette démo a le même problème que vous décrivez et la solution de contournement aide. Si msdeploy appelle le fichier .bat de la même manière ou d'une manière similaire, j'espère que c'est une solution.

+1

-inputformat aucun n'a résolu le problème! Merci! –

+1

Selon le Powershell 2.0 et 3.0 [documentation] (http://technet.microsoft.com/en-us/library/hh847736.aspx) 'None' n'est pas un argument' -InputFormat' valide, donc cette solution de contournement peut être s'appuyer sur un comportement indéfini. –

2
powershell.exe -file ScriptFile.ps < CON 

Cela résout le problème sans avoir recours à des fonctionnalités non documentées.

+2

Qu'est-ce que cela fait réellement? – Doug