2010-10-27 5 views
0

Je crée un fichier batch pour exécuter mon psake construit tout en intégrant avec TeamCity et les commandlets TFS Powershell de TFPT et sont venus avec les éléments suivants:L'exécution du script PSAKE de la ligne de commande

@ECHO OFF 

SET COMMAND_TO_EXECUTE= 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% "& { 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% Import-Module '..\tools\psake\psake.psm1'; 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% try 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% { 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% invoke-psake -framework '4.0' -taskList %1 -properties @{config='%2'} 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% }; 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% catch 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% { 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% . ..\tools\psake\teamcity.ps1; 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% if(![string]::IsNullOrEmpty($env:TEAMCITY_VERSION)) 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% {TeamCity-ReportBuildStatus -status 'FAILURE' -text $_} 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% else 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% {Write-Host ERROR: $_ -ForegroundColor RED}; 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% exit $Error.Count; 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% }; 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% finally {remove-module psake}; 
SET COMMAND_TO_EXECUTE=%COMMAND_TO_EXECUTE% };" 

echo Build command is %COMMAND_TO_EXECUTE% 

IF %PROCESSOR_ARCHITECTURE% == x86 (
powershell -PSConsoleFile "%TFSPowerToolDir%tfshell.psc1" -Version "2.0" -NoProfile -ExecutionPolicy unrestricted -Command %COMMAND_TO_EXECUTE% 
) ELSE C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -PSConsoleFile "%TFSPowerToolDir%tfshell.psc1" -Version "2.0" -NoProfile -ExecutionPolicy unrestricted -Command %COMMAND_TO_EXECUTE% 

J'étais avoir des problèmes avec les builds qui n'échouent pas dans TeamCity quand des erreurs se produisent parce que Powershell ne quitte jamais avec un code de sortie différent de zéro. Donc ce que je tente de faire dans le script ci-dessus est d'attraper les erreurs de terminaison de la commande Invoke-Psake, de signaler l'erreur à teamcity et de quitter le processus avec un code non nul égal au nombre d'erreurs survenues. Autant que je peux dire le script semble bien. L'exécution de la commande résultante semble fonctionner correctement. Cependant, il en cours d'exécution dans le cadre du fichier batch ci-dessus avec la commande affectée à l'argument -Command de l'exécutable Powershell il échoue avec l'erreur:

Missing expression after unary operator '-'

Je ne vois pas pourquoi cela devrait être d'autant plus que d'exécuter la commande sur son propre semble fonctionner correctement. Quelqu'un peut-il faire la lumière sur le sujet? C'est probablement une erreur de syntaxe quelque part mais je n'arrive pas à comprendre.

Répondre

0

Hmmm, pensez que vous devez faire un peu de magie avec les charaters d'échappement. Toute invocation de Powershell je fais de cmd J'essaie de garder la formation comme suit: -

"powershell.exe -command '& {C: \ Temp \ Example.ps1 -param1 bonjour.}"

Votre complication provient de la variable cmd multi-lignes que vous essayez de construire, chaque ligne que la variable est développée va supprimer toutes les séquences d'échappement que vous appliquez. Je foiré autour d'un peu pour vous, mais pensé .... pourquoi ne pas vous venez de créer .ps1 script avec votre bloc de script, enregistre une mauvaise fuite, etc.

Alors Invoke-Build.ps1 devient - Param ($ TaskList, $ config) import-Module .. \ tools \ psake \ psake.psm1 essayer { Invoke-psake -Cadre 4,0 -taskList $ TaskList -properties @ {config = $ config}} capture { . .. \ tools \ psake \ teamcity.ps1; si ([string] :: IsNullOrEmpty (env $: TEAMCITY_VERSION)) { TeamCity-ReportBuildStatus -status PANNE -text $ _ } { autre Write-Host ERREUR: $ _ -ForegroundColor ROUGE } sortie Error.count de $ } { enfin supprimer module psake}

Ensuite, vous pouvez simplement les points sur la source du script de cmd ......

@echo OFF

SET COMMAND_TO_EXECUTE = Invoke-Build.ps1

écho Construction commande est "% COMMAND_TO_EXECUTE%"

IF% PROCESSOR_ARCHITECTURE% == x86 ( powershell -PSConsoleFile "% TFSPowerToolDir% tfshell.psc1" -Version « 2,0 "-NoProfile -ExecutionPolicy unrestricted -Command" & {. % COMMAND_TO_EXECUTE% -TaskList -Config} " ) SINON ( ) C: \ Windows \ SysWOW64 \ WindowsPowerShell \ v1.0 \ powershell.exe -PSConsoleFile"% TFSPowerToolDir% tfshell.psc1 "-Version" 2.0 "-NoProfile -ExecutionPolicy unrestricted -Command" & {. % COMMAND_TO_EXECUTE% -TaskList -Config} "

Questions connexes