Sto impostando un attributo XML con una stringa e PowerShell mi dice che "solo le stringhe possono essere utilizzate come valori per impostare le proprietà XmlNode". Ecco un semplice esempio. In primo luogo, ho eseguito questo:Perché PowerShell mi sta dicendo che una stringa non è una stringa? E solo quando si chiama String.Length, prima
$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)
Per me, l'output è:
$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
Questo messaggio di errore si è avuto modo di essere sbagliato. Il valore sul lato destro del segno di uguale a è a String, come mostrato nell'output sopra. Ma ha errato, quindi l'attributo XML continua a leggere "a". Ora diventa più strano. Esaminiamo la riga che chiama $ newId.length e osserviamo che funziona correttamente.
Come commento: #$length = $newId.Length
. L'uscita è ora:
$newId is a string, see: $newId.GetType().FullName = System.String
Running "$xmlDoc.root.ComponentRef.Id = $newId"...
ComponentRef.Id is now: b
Non sto chiedendo per una correzione, perché so come risolvere questo problema lanciando a [stringa] sul lato destro dell'ultimo operatore di assegnazione. Quello che vorrei sapere è:
Qualcuno può spiegare perché chiamare $ newId.Length (un getter!) Potrebbe far pensare a PowerShell che $ newId non sia più una stringa?
Grazie!
Sembra che il problema sia da qualche parte nel modo in cui gli oggetti PowerShell vengono adattati dagli oggetti .NET di root (ad esempio, in C# non si potrebbe t chiama xmlDoc.root - root è una proprietà che PS sta aggiungendo). Questo dovrebbe essere trasparente per PS e per qualsiasi oggetto .NET che si incontra, quindi non sono sicuro del motivo per cui questo sta esplodendo. $ xmlDoc.root.ComponentRef.SetAttribute ("Id", $ newId) per esempio funziona bene. Molto strano ... –
Deve essere qualcosa del genere. È strano che chiamare Length lo faccia scattare. Mi fa pensare che sia un bug di PowerShell. Forse è fin dove arriva la risposta, vedremo;) Non sono sicuro se il team di PowerShell prende segnalazioni di bug dal grande pubblico o meno. – Vimes
JohnB si occupa di segnalazioni di bug - accedi a connect.microsoft.com/powershell con un ID live e registra il bug con la repro. – x0n