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?
¡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. –
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
@jasonmarcher: De acuerdo, pero esto parecía ser único con el '=' ya que escapar no importaba. Pruébalo y verás. –