Bir String ile bir XML özniteliği ayarlıyorum ve PowerShell bana "yalnızca dizeleri XmlNode özelliklerini ayarlamak için değer olarak kullanılabilir" diyor. İşte basit bir örnek. Birincisi, bu çalıştırın:Neden PowerShell'in bir String söylediği bir String değil? Ve sadece String.Length çağrılırken, ilk
$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)
Benim için çıktıdır:
$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
O hata mesajı yanlış olmak zorunda. eşittir işaretinin sağ tarafındaki değer, yukarıdaki çıktıda gösterildiği gibi bir a String'dir. Ama o, bu yüzden, XML özniteliği hala "a" okuyor. Şimdi garipleşiyor. Yeni newdd.length çağıran satırı yorumlayalım ve doğru şekilde çalıştığını izleyelim.
Böyle yorum yaparken: #$length = $newId.Length
. Çıktı şimdi: Geçen atama operatörünün sağ tarafındaki [dize] olarak atayarak bu soruna geçici bir çözüm biliyorum çünkü bir düzeltme için sormuyorum
$newId is a string, see: $newId.GetType().FullName = System.String
Running "$xmlDoc.root.ComponentRef.Id = $newId"...
ComponentRef.Id is now: b
. Bilmek istediklerim:
$ newId.Length (getter!) Çağrısının neden PowerShell'in $ newId'nin artık bir ip olduğunu düşünmesine neden olduğunu açıklayabilir mi?
Teşekkürler!
Sorun, PowerShell nesnelerinin kök .NET nesnelerine nasıl uyarlandığıyla ilgili bir sorun olduğu gibi (örneğin, C# içinde t xmlDoc.root çağrısı - root, PS'nin eklediği bir özelliktir). Bu, PS'ye ve karşılaştığınız herhangi bir .NET nesnesine karşı saydam olmalıdır, bu yüzden neden bu kadar uçtuğunu bilmiyorum. Örneğin, iyi işler için $ xmlDoc.root.ComponentRef.SetAttribute ("Id", $ newId). Çok garip ... –
Böyle bir şey olmalı. Boy'un onu tetikleyeceği garipti. Bana bir PowerShell hatası olduğunu düşünür. Belki de cevabı alabildiğimiz kadarıyla, göreceğiz;) PowerShell ekibinin genel halktan hata raporları alıp almadığından emin değilim. – Vimes
JohnB hata raporları alırlar - canlı bir kimlik ile connect.microsoft.com/powershell adresine giriş yapın ve hatayı repro ile günlüğe kaydedin. – x0n