Я устанавливаю XML-атрибут с помощью String, и PowerShell сообщает мне, что «только строки могут использоваться в качестве значений для установки свойств XmlNode». Вот простой пример. Во-первых, я запускаю это:
$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)
Для меня вывод:
$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
Это сообщение об ошибке должно быть неверным. Значение справа от знака равенства равно строке, как показано в выходных данных выше. Но произошла ошибка, поэтому атрибут XML по-прежнему читается как «a». Теперь это становится более странным. Давайте закомментируем строку, вызывающую $newId.length, и посмотрим, как она работает правильно.
Комментирование как таковое:#$length = $newId.Length
. Вывод теперь :
$newId is a string, see: $newId.GetType().FullName = System.String
Running "$xmlDoc.root.ComponentRef.Id = $newId"...
ComponentRef.Id is now: b
. Я не прошу исправления, потому что знаю, как обойти эту проблему, приведя к [string] справа от последнего оператора присваивания. Что я хотел бы знать, так это:
Может ли кто-нибудь объяснить, почему вызов $newId.Length (геттером! )мог заставить PowerShell думать, что $newId больше не является строкой?
Спасибо!