Tôi đang thiết lập thuộc tính XML bằng String và PowerShell cho tôi biết "chỉ các chuỗi có thể được sử dụng làm giá trị để đặt thuộc tính XmlNode". Đây là một ví dụ đơn giản. Trước tiên, tôi chạy này:Tại sao PowerShell cho tôi biết một chuỗi không phải là một chuỗi? Và chỉ khi gọi String.Length, đầu tiên là
$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)
Đối với tôi, kết quả là:
$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
Đó thông báo lỗi đã có thể sai. Giá trị ở bên phải của dấu bằng là một Chuỗi, như được hiển thị trong đầu ra ở trên. Nhưng nó sai, vì vậy thuộc tính XML vẫn đọc "a". Bây giờ nó được weirder. Hãy bình luận ra dòng gọi $ newId.length và xem nó hoạt động chính xác.
Nhận xét như vậy: #$length = $newId.Length
. Kết quả hiện tại là:
$newId is a string, see: $newId.GetType().FullName = System.String
Running "$xmlDoc.root.ComponentRef.Id = $newId"...
ComponentRef.Id is now: b
Tôi không yêu cầu khắc phục, vì tôi biết cách giải quyết vấn đề này bằng cách truyền tới [string] ở bên phải của toán tử gán cuối cùng. Điều tôi muốn biết là:
Bất cứ ai có thể giải thích lý do tại sao gọi $ newId.Length (getter!) Có thể khiến PowerShell nghĩ $ newId không còn là chuỗi nữa?
Cảm ơn!
Có vẻ vấn đề ở đâu đó trong cách đối tượng PowerShell được điều chỉnh từ đối tượng .NET gốc (ví dụ: trong C# bạn không thể ' t gọi xmlDoc.root - root là thuộc tính mà PS đang thêm). Điều này phải rõ ràng đối với PS và đối với bất kỳ đối tượng .NET nào bạn gặp phải, vì vậy tôi không chắc chắn tại sao đối tượng này lại bị thổi phồng lên. $ xmlDoc.root.ComponentRef.SetAttribute ("Id", $ newId) cho ví dụ hoạt động tốt. Rất lạ ... –
Nó phải giống như thế. Nó chắc chắn kỳ lạ mà gọi Length sẽ kích hoạt nó. Làm tôi nghĩ đó là lỗi PowerShell. Có lẽ đó là như xa như câu trả lời sẽ đi, chúng ta sẽ thấy;) Tôi không chắc liệu nhóm PowerShell có báo cáo lỗi từ công chúng hay không. – Vimes
JohnB họ thực hiện báo cáo lỗi - đăng nhập vào connect.microsoft.com/powershell bằng id trực tiếp và đăng nhập lỗi bằng repro. – x0n