Estoy configurando un atributo XML con un String, y PowerShell me dice "solo se pueden usar cadenas como valores para establecer propiedades XmlNode". Aquí hay un ejemplo simple. En primer lugar, me encuentro esto:¿Por qué PowerShell me dice que una cadena no es una cadena? Y solo cuando llamo String.Length, primero
$xmlDoc = [xml]@"
<root>
<ComponentRef Id="a" />
</root>
"@
$newId = "b"
$length = $newId.Length
Write-Host ("`n`$newId is a string, see: `$newId.GetType().FullName = " + $newId.GetType().FullName + "`n")
Write-Host ("Running `"`$xmlDoc.root.ComponentRef.Id = `$newId`"...`n")
$xmlDoc.root.ComponentRef.Id = $newId
Write-Host ("ComponentRef.Id is now: " + $xmlDoc.root.ComponentRef.Id)
Para mí, la salida es:
$newId is a string, see: $newId.GetType().FullName = System.String
Running "$xmlDoc.root.ComponentRef.Id = $newId"...
Cannot set "Id" because only strings can be used as values to set XmlNode properties.
At D:\Build\Tools\mass processing\Untitled4.ps1:14 char:27
+ $xmlDoc.root.ComponentRef. <<<< Id = $newId
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : PropertyAssignmentException
ComponentRef.Id is now: a
Ese mensaje de error tiene que ser malo. El valor en el lado derecho del signo de igual es a String, como se muestra en el resultado anterior. Pero tenía errores, por lo que el atributo XML aún dice "a". Ahora se pone más raro. Comentemos la línea que llama $ newId.length, y miremos cómo funciona correctamente.
Comentando como tal: #$length = $newId.Length
. La salida es ahora:
$newId is a string, see: $newId.GetType().FullName = System.String
Running "$xmlDoc.root.ComponentRef.Id = $newId"...
ComponentRef.Id is now: b
No estoy pidiendo una solución, porque sé cómo evitar este problema echando a [cadena] en el lado derecho del último operador de asignación. Lo que me gustaría saber es:
¿Alguien puede explicar por qué llamar $ newId.Length (un getter!) Podría hacer que PowerShell piense que $ newId ya no es una cadena?
Gracias!
Parece que el problema es en algún lugar de cómo los objetos PowerShell están adaptadas a los objetos .NET raíz (por ejemplo, en C# no podías t llame a xmlDoc.root - root es una propiedad que PS está agregando). Esto debería ser transparente para PS y para cualquier objeto .NET que encuentres, así que no estoy seguro de por qué está explotando. $ xmlDoc.root.ComponentRef.SetAttribute ("Id", $ newId) por ejemplo funciona bien. Muy extraño ... –
Tiene que ser algo así. Es muy extraño que llamar a Length lo desencadene. Me hace pensar que es un error de PowerShell. Tal vez sea tan lejos como vaya la respuesta, ya veremos;) No estoy seguro si el equipo de PowerShell toma informes de errores del público en general o no. – Vimes
JohnB toman informes de errores: inicie sesión en connect.microsoft.com/powershell con una identificación en vivo y registre el error con la reproducción. – x0n