2011-02-09 5 views
14

Tenemos un archivo por lotes que invoca nuestro proceso de compilación basado en MSBuild. Sintaxis:¿Cómo paso un signo igual cuando llamo a un script por lotes en Powershell?

build App Target [ Additional MSBuild Arguments ] 

Internamente, se hace esto:

msbuild.exe %1.msbuild /t:%2 %3 %4 %5 %6 %7 %8 %9 

lo que se traduce en llamadas a MSBuild que se parecen a esto:

 
msbuild.exe App.msbuild /t:Target 

Cuando cualquier argumento contiene el signo igual, = , Powershell lo elimina completamente. Mi script por lotes nunca lo ve. Esto no ocurre con el indicador de comando estándar cmd.exe.

Por ejemplo, si llamo

build App Target "/p:Property=Value" 

esto es lo que se pasa a MSBuild:

msbuild.exe App.msmbuild /t:Target /p:Property Value 

esperaba que esto:

msbuild.exe App.msbuild /t:Target "/p:Property=Value" 

He intentado la fuga Powershell carácter, el carácter de escape estándar del símbolo del sistema, e incluso cosas que inventé:

build App Target "/p:Property=Value" 
build App Target '/p:Property=Value' 
build App Target /p:Property^=Value 
build App Target /p:Property`=Value 
build App Target /p:Property==Value 

Nada de eso funciona. ¿Qué debo hacer para que el signo igual no se elimine o elimine?

Respuesta

17

he visto esto antes y han encontrado una forma de truco que fuera. Me gustaría poder explicar lo que está pasando en particular con el '=', pero no puedo. En su situación estoy bastante seguro de que el siguiente trabajo si quiere pasar propiedades a msbuild:

build App Target '"/p:Property=Value"' 

Cuando se hizo eco, esto produce lo siguiente:

msbuild.exe App.msbuild /t:Target "/p:Property=Value" 
+0

¡Eso funcionó! Pensé que probé esa combinación, pero supongo que solo intenté con comillas simples, sin comillas simples con comillas dobles. Powershell puede ser bastante extraño a veces. –

+1

El problema es que PowerShell no cita los argumentos cuando se pasan a los ejecutables. Por lo tanto, aunque PowerShell sabe que "/ p: Property = Value" es una cadena, la pasa sin comillas. Esto puede hacer que los ejecutables no lo vean como un solo argumento. Tuve el mismo problema con incluir citas en una discusión, y tuve que \ escapar de ellas. – JasonMArcher

+0

@jasonmarcher: De acuerdo, pero esto parecía ser único con el '=' ya que escapar no importaba. Pruébalo y verás. –

0

No sé si hay una respuesta más fácil (creo que no) pero puede resolver el problema utilizando la clase de proceso de .Net para invocar cmd.exe. Aquí hay un ejemplo:

# use .NET Process class to run a batch file, passing it an argument that contains an equals sign. 
# This test script assumes the existence of a batch file "c:\temp\test.bat" 
# that has this content: 
#  echo %1 
#  pause 
$cmdLine = $cmdLine = '/c c:\temp\test.bat "x=1"' 
$procStartInfo = new-object System.Diagnostics.ProcessStartInfo("cmd", $cmdLine) 
$proc = new-object System.Diagnostics.Process 
$proc.StartInfo = $procStartInfo 
$proc.Start(); 
+0

Esto no funcionará. Invocar el archivo por lotes tiene que ser una operación de una línea, como se indica en mi pregunta. –

+0

Bueno, podrías hacer que funcione, entonces podría ser de una sola línea. Pero espero que la respuesta de Scott sea evidente. –

0

¿Has probado las comillas simples para forzar una interpretación literal?

O: cmd/c 'msbuild.exe App.msbuild/t: Target "/ t: Propiedad = Valor"'

+0

Sí. He actualizado mi pregunta para mostrar las comillas simples. –

+0

Invocar un archivo de proceso por lotes también soltará el signo =, aunque en este caso es suficiente con adjuntar entre comillas para conservarlo. – yoyo

2

Con PowerShell 3 puede utilizar - % para detener el análisis normal de powershell.

build --% App Target "/p:Property=Value" 
0

parece que sólo comilla simple alrededor de comillas dobles podría ser el mejor para múltiples escenarios alrededor de entorno Windows. El siguiente enlace de MS muestra su soporte (o limitación) del signo igual http://support.microsoft.com/kb/35938 Es específico de los archivos por lotes pero es probable que afecte a muchos otros productos de shell MS.

Cuestiones relacionadas