Ustawiam atrybut XML za pomocą String, a PowerShell mówi mi "tylko łańcuchy mogą być używane jako wartości do ustawienia właściwości XmlNode". Oto prosty przykład. Po pierwsze, to uruchomić:Dlaczego PowerShell mówi mi, że ciąg nie jest ciągiem? I tylko przy wywołaniu String.Length, najpierw
$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)
Dla mnie wyjście jest:
$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
Ten komunikat ma być błędne. Wartość po prawej stronie znaku równości to ciąg, jak pokazano na powyższym wyjściu. Ale uległo ono erozji, więc atrybut XML nadal brzmi "a". Teraz robi się jeszcze dziwniej. Skomentuj linię, która wywołuje $ newId.length i zobacz, jak działa poprawnie.
Komentując jako taki: #$length = $newId.Length
. Wyjście jest teraz:
$newId is a string, see: $newId.GetType().FullName = System.String
Running "$xmlDoc.root.ComponentRef.Id = $newId"...
ComponentRef.Id is now: b
Nie pytam o kropce, bo wiem, jak obejść ten problem poprzez odlewanie na [ciąg] po prawej stronie ostatniego operatora przypisania. Co chciałbym wiedzieć to:
Czy ktoś może wyjaśnić, dlaczego wywołanie $ newId.Length (getter!) Może spowodować, że PowerShell uzna, że $ newId nie jest już ciągiem znaków?
Dzięki!
Wygląda na to, że problem tkwi gdzieś w sposobie, w jaki obiekty PowerShell są zaadaptowane z obiektów root .NET (na przykład w C# nie mogłeś t wywołaj xmlDoc.root - root jest właściwością, którą PS dodaje). To powinno być przezroczyste dla PS i dowolnych obiektów .NET, które napotykasz, więc nie jestem pewien, dlaczego ten wysadza w powietrze. $ xmlDoc.root.ComponentRef.SetAttribute ("Id", $ newId) na przykład działa dobrze. Bardzo dziwne ... –
To musi być coś takiego. Na pewno dziwne, że wywołanie długości go uruchomi. Sprawia, że myślę, że to błąd PowerShell. Być może to jest tak daleko, jak odpowiedź pójdzie, zobaczymy;) Nie jestem pewien, czy zespół PowerShell przyjmuje zgłoszenia błędów od ogółu, czy też nie. – Vimes
JohnB robią raporty o błędach - zaloguj się, aby połączyć się z witryną.microsoft.com/powershell z identyfikatorem Live i zgłoś błąd za pomocą repro. – x0n