Duplicate Question and Answer I Posted, aquí para la posteridad de cuando se ha votado a cerrado. La diferencia clave es que esta pregunta se limitó a ser OOTB y mi auto-respuesta se mantiene dentro de esa restricción.
Pregunta
PowerShell no parecen tener una forma fácil de activar con un comando arbitrario y luego brotan de análisis sintáctico y ejecución de errores de una manera que interactúa correctamente con las personas que llaman que no están PowerShell - por ejemplo, cmd.exe
, TeamCity etc.
Mi pregunta es simple. ¿Cuál es la mejor manera para mí con OOTB MSBuild v4 y PowerShell v3 (abierto a sugerencias, no descartaría una tarea MSBuild preparada para producción adecuada, pero tendría que ser un poco más fuerte que sugerir "es fácil" tomando la muestra de PowerShell Task Factory y modificarlo y/o convertirlo en mantenedor/padre ") para ejecutar un comando (ya sea un segmento de script pequeño o (más comúnmente) una invocación de un script .ps1
.
Creo que debería ser algo normal como:
<Exec
IgnoreStandardErrorWarningFormat="true"
Command="PowerShell "$(ThingToDo)"" />
que lamentablemente no funciona: -
- si
ThingToDo
no puede analizar, se produce un error en silencio
- si
ThingToDo
es una invocación de la escritura que no existe, se produce un error
- si desea propagar una
ERRORLEVEL
basado .cmd
resultado, se pone peluda
- Si desea incrustar
"
cotizaciones en el ThingToDo
, no va a funcionar
Así que, ¿cuál es el camino a prueba de balas de ejecutar PowerShell desde MSBuild supone que es? ¿Hay algo que pueda PsGet para que todo esté bien?
respuesta
Weeeeelll, usted podría utilizar algo de largo aliento como esto hasta que encuentre una mejor manera: -
<PropertyGroup>
<__PsInvokeCommand>powershell "Invoke-Command</__PsInvokeCommand>
<__BlockBegin>-ScriptBlock { $errorActionPreference='Stop';</__BlockBegin>
<__BlockEnd>; exit $LASTEXITCODE }</__BlockEnd>
<_PsCmdStart>$(__PsInvokeCommand) $(__BlockBegin)</_PsCmdStart>
<_PsCmdEnd>$(__BlockEnd)"</_PsCmdEnd>
</PropertyGroup>
Y entonces 'todo' lo que necesita hacer es:
<Exec
IgnoreStandardErrorWarningFormat="true"
Command="$(_PsCmdStart)$(ThingToDo)$(_PsCmdEnd)" />
La característica única de canje de esto (aparte de atrapar todos los tipos de error que pude pensar), es que funciona OOTB con cualquier versión de PowerShell y cualquier versión de MSBuild.
Voy a obtener mi abrigo.
Usaría la publicación del blog como iniciador. Estamos trabajando con un consultor de Microsoft y es la publicación a la que nos remitió. Intenté la tarea Powershell MSBuild en codeplex, y se equivoca en un script mío de Powershell que funciona en la tarea creada por Bart De Smet. –