none
PowerShell xml node assignment bug? RRS feed

  • Question

  • Hello, I just ran the following script:

    [xml]$xmlDoc = Get-Content C:\sysprep.xml;
    $xmlDoc.unattend.settings.Where({$_.pass -eq "specialize"}).component.Where({$_.name -eq "Microsoft-Windows-Shell-Setup"}).ComputerName = "Test2";

    But it threw an "Assignment Exception" with a small note, that the property "ComputerName" could not be found within the object. Besides an Get-Member shows that it exists and that there is a get and a set functionality.

    Also if I rewrite the second line to

    (($xmlDoc.unattend.settings | Select-Object -First 1).component | Select-Object -First 1).ComputerName

    it works, but it is not that specific...

    Windows Version: Server 2016 (1607 Build 14393.1198)

    PSVersion: 5.1.14393.1198

    So my question:

    Am I doing something wrong or is this a bug I'm triggering here?



    • Edited by agowa338 Sunday, June 18, 2017 2:50 AM Version number
    Sunday, June 18, 2017 2:48 AM

All replies

  • Attributes are not properties.

    $xmlDox.SelectNodes('//settings{@pass="specialize"]')

    This will select nodes with that attribute.


    \_(ツ)_/


    • Edited by jrv Sunday, June 18, 2017 3:27 AM
    Sunday, June 18, 2017 3:27 AM
  • I'm not quite sure how that would help here. Maybe it is better to "show some xml", too.

    <?xml version="1.0" encoding="utf-8"?>
    <unattend xmlns="urn:schemas-microsoft-com:unattend" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
        <settings pass="specialize">
            <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <CopyProfile>true</CopyProfile>
                <ComputerName>Test01</ComputerName>
            </component>
        </settings>
    </unattend>

    The settings and component section exist multiple times. I want to change the "Test01" within ComputerName using a script.

    Also just writing:

    $xmlDoc.unattend.settings.Where({$_.pass -eq "specialize"}).component.Where({$_.name -eq "Microsoft-Windows-Shell-Setup"}).ComputerName

    Correctly outputs "Test01", so whats up here?

    • Edited by agowa338 Sunday, June 18, 2017 3:43 AM
    Sunday, June 18, 2017 3:38 AM
  • You will also need to specify a namespace to the namespace manager.

    \_(ツ)_/

    Sunday, June 18, 2017 3:40 AM
  • Is this what you are trying to do?

    [xml]$xml = @'
    <unattend xmlns="urn:schemas-microsoft-com:unattend" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
    	<settings pass="specialize">
    		<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    			<CopyProfile>true</CopyProfile>
    			<ComputerName>Test01</ComputerName>
    		</component>
    	</settings>
    </unattend>
    '@
    $xml.unattend.settings | Where-Object{ $_.pass -eq 'specialize' } | Select-Object -ExpandProperty component
    


    \_(ツ)_/

    Sunday, June 18, 2017 3:45 AM
  • Is this what you are trying to do?

    [xml]$xml = @'
    <unattend xmlns="urn:schemas-microsoft-com:unattend" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
    	<settings pass="specialize">
    		<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    			<CopyProfile>true</CopyProfile>
    			<ComputerName>Test01</ComputerName>
    		</component>
    	</settings>
    </unattend>
    '@
    $xml.unattend.settings | Where-Object{ $_.pass -eq 'specialize' } | Select-Object -ExpandProperty component


    \_(ツ)_/

    No.

    As stated above, I want to change the String "Test01" to "Test02" (for now), so that I can generate multiple xml files using this as a template.

    Sunday, June 18, 2017 3:54 AM
  • You must specify all criteria to the node.  You cannot be ambiguous.  What is your criteria?

    $node = $xmlDox.SelectNodes('//settings{@pass="specialize"]',$namespacemanager)

    $node..computername = 'test02'

    If that is not selective then you have to define the selectors that specify the exact node.


    \_(ツ)_/

    Sunday, June 18, 2017 3:59 AM
  • If what you posted is the file then this will work:

    $xml.unattend.settings.component.ComputerName = 'Test02'


    \_(ツ)_/

    Sunday, June 18, 2017 4:02 AM
  • Ok, maybe it's me not understanding xml...

    Can you please explain, what I did wrong?

    I'm able to query the thingy i want to change using:

    $xmlDoc.unattend.settings.Where({$_.pass -eq "specialize"}).component.Where({$_.name -eq "Microsoft-Windows-Shell-Setup"}).ComputerName

    Doing a get-member shows there is a Get and a Set for ComputerName:

    $xmlDoc.unattend.settings.Where({$_.pass -eq "specialize"}).component.Where({$_.name -eq "Microsoft-Windows-Shell-Setup"}) | Get-Member ComputerName

    Output:

       TypeName: System.Xml.XmlElement#urn:schemas-microsoft-com:unattend#component
    
    Name         MemberType Definition                    
    ----         ---------- ----------                    
    ComputerName Property   string ComputerName {get;set;}

    Next I tried:

    $xmlDoc.unattend.settings.Where({$_.pass -eq "specialize"}).component.Where({$_.name -eq "Microsoft-Windows-Shell-Setup"}).ComputerName = "Test02";

    Output:

    Die Eigenschaft "ComputerName" wurde für dieses Objekt nicht gefunden. Vergewissern Sie sich, dass die Eigenschaft vorhanden ist und 
    festgelegt werden kann.
    In Zeile:1 Zeichen:1
    + $xmlDoc.unattend.settings.Where({$_.pass -eq "specialize"}).component ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : PropertyAssignmentException

    Why am I able to get, but not to set it this way?

    Sunday, June 18, 2017 4:16 AM
  • Assuming there is only one of these in the fil:

    $node = $xmlDoc.unattend.settings | Where {$_.pass -eq  'specialize'}
    $node.component.ComputerName = 'Test02'


    \_(ツ)_/

    Sunday, June 18, 2017 4:23 AM
  • And more selective:

    $node = $xml.unattend.settings | Where {$_.pass -eq 'specialize' -and $_.component.Name -eq 'Microsoft-Windows-Shell-Setup'}


    \_(ツ)_/

    Sunday, June 18, 2017 4:29 AM
  • Yes, this works.

    Now the question is, why does this work, but not with ".where()"? I just want to understand, why this is failing...

    Why can I only assign a new value using "| Where {}" but not using ".where({})"?

    Sunday, June 18, 2017 4:35 AM
  • Why would you expect that to work?  XML does not have a "Where" method.  That is a PS extension to PsObjects.


    \_(ツ)_/

    Sunday, June 18, 2017 4:39 AM
  • Because it worked before.

    I just tried, it even works in the current example:

    [xml]$xml = @'
    <unattend xmlns="urn:schemas-microsoft-com:unattend" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
    	<settings pass="specialize">
    		<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    			<CopyProfile>true</CopyProfile>
    			<ComputerName>Test01</ComputerName>
    		</component>
    	</settings>
        <settings pass="oobeSystem">
        </settings>
    </unattend>
    '@
    $a = $xml.unattend.settings.Where({$_.pass -eq "specialize"}).component;
    $a.ComputerName = "TEST02";

    But not if chained (multiple "<component>"):

    [xml]$xml = @'
    <unattend xmlns="urn:schemas-microsoft-com:unattend" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
    	<settings pass="specialize">
    		<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    			<CopyProfile>true</CopyProfile>
    			<ComputerName>Test01</ComputerName>
    		</component>
            <component name="Networking-MPSSVC-Svc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <FirewallGroups>
                    <FirewallGroup wcm:action="add" wcm:keyValue="RemoteDesktop">
                        <Active>true</Active>
                        <Profile>all</Profile>
                        <Group>@FirewallAPI.dll,-28752</Group>
                    </FirewallGroup>
                </FirewallGroups>
                <DomainProfile_LogDroppedPackets>true</DomainProfile_LogDroppedPackets>
                <PrivateProfile_LogDroppedPackets>true</PrivateProfile_LogDroppedPackets>
                <PublicProfile_LogDroppedPackets>true</PublicProfile_LogDroppedPackets>
                <PublicProfile_LogSuccessfulConnections>true</PublicProfile_LogSuccessfulConnections>
                <PrivateProfile_LogSuccessfulConnections>true</PrivateProfile_LogSuccessfulConnections>
                <DomainProfile_LogSuccessfulConnections>true</DomainProfile_LogSuccessfulConnections>
            </component>
    	</settings>
        <settings pass="oobeSystem">
        </settings>
    </unattend>
    '@
    $a = $xml.unattend.settings.Where({$_.pass -eq "specialize"}).component.Where({$_.name -eq "Microsoft-Windows-Shell-Setup"})
    $a.ComputerName = "TEST02"
    Do you have any explanation for this behavior?
    Sunday, June 18, 2017 4:58 AM
  • What is the unique selector for the component you want?  You need a unique selector or you  need to enumerate all nodes and change each one.


    \_(ツ)_/

    Sunday, June 18, 2017 5:14 AM
  • The unique selector for the settings node is "pass" and for the component node "name".

    I've now a working way using the Where-Object cmdlet, but that still does not explain, why the ".Where"-Function does work if used alone...

    Because doing a pointless " | Where-Object {$true}" also solves the issue, this seams to be bugged.

    In summary:

    $xmlDoc.unattend.settings.Where({$_.pass -eq "specialize"}).component.Where({$_.name -eq "Microsoft-Windows-Shell-Setup"}).ComputerName = "Test02";

    Does not work, but doing the following does:

    $xmlDoc.unattend.settings.Where({$_.pass -eq "specialize"}).component.Where({$_.name -eq "Microsoft-Windows-Shell-Setup"} | Where-Object {$true}).ComputerName = "Test02";

    Where is the difference? What does the Where-Object cmdlet change here? I now primarily want to understand, why PowerShell does behave this way.

    Sunday, June 18, 2017 12:14 PM
  • Actually none of that works with XML.

    This is what happens:

    PS D:\scripts> $xmlDoc.unattend.settings.Where({$_.pass -eq "specialize"})
    Method invocation failed because [System.Xml.XmlElement] does not contain a method named 'Where'.
    At line:1 char:1
    The XmlElement type doe  not support the "Where" method.


    \_(ツ)_/

    Sunday, June 18, 2017 5:52 PM
  • It works for me. Which PowerShell Version do you have?

    I'm on 5.1.14393.1358 on Windows Server 2016.

    And there is also a "Where" Method with xml:

    **********************
    Start der Windows PowerShell-Aufzeichnung
    Startzeit: 20170618200631
    Benutzername: ADS02\Administrator
    RunAs-Benutzer: ADS02\Administrator
    Computer: ADS02 (Microsoft Windows NT 10.0.14393.0)
    Hostanwendung: C:\Windows\System32\WindowsPowerShell\v1.0\powershell_ise.exe
    Prozess-ID: 280
    PSVersion: 5.1.14393.1358
    PSEdition: Desktop
    PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.14393.1358
    BuildVersion: 10.0.14393.1358
    CLRVersion: 4.0.30319.42000
    WSManStackVersion: 3.0
    PSRemotingProtocolVersion: 2.3
    SerializationVersion: 1.1.0.1
    **********************
    Die Aufzeichnung wurde gestartet. Die Ausgabedatei ist "xml.txt".
    PS C:\Users\Administrator\Desktop> [xml]$xml = @'
    <unattend xmlns="urn:schemas-microsoft-com:unattend" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
    	<settings pass="specialize">
    		<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    			<CopyProfile>true</CopyProfile>
    			<ComputerName>Test01</ComputerName>
    		</component>
            <component name="Networking-MPSSVC-Svc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <FirewallGroups>
                    <FirewallGroup wcm:action="add" wcm:keyValue="RemoteDesktop">
                        <Active>true</Active>
                        <Profile>all</Profile>
                        <Group>@FirewallAPI.dll,-28752</Group>
                    </FirewallGroup>
                </FirewallGroups>
                <DomainProfile_LogDroppedPackets>true</DomainProfile_LogDroppedPackets>
                <PrivateProfile_LogDroppedPackets>true</PrivateProfile_LogDroppedPackets>
                <PublicProfile_LogDroppedPackets>true</PublicProfile_LogDroppedPackets>
                <PublicProfile_LogSuccessfulConnections>true</PublicProfile_LogSuccessfulConnections>
                <PrivateProfile_LogSuccessfulConnections>true</PrivateProfile_LogSuccessfulConnections>
                <DomainProfile_LogSuccessfulConnections>true</DomainProfile_LogSuccessfulConnections>
            </component>
    	</settings>
        <settings pass="oobeSystem">
        </settings>
    </unattend>
    '@
    $a = $xml.unattend.settings.Where({$_.pass -eq "specialize"})
    PS C:\Users\Administrator\Desktop> $?
    True
    PS C:\Users\Administrator\Desktop> $a
    
    pass       component
    ----       ---------
    specialize {Microsoft-Windows-Shell-Setup, Networking-MPSSVC-Svc}
    
    
    PS C:\Users\Administrator\Desktop> Stop-Transcript
    **********************
    Ende der Windows PowerShell-Aufzeichnung
    Endzeit: 20170618200710
    **********************
    

    • Proposed as answer by jrv Sunday, June 18, 2017 11:00 PM
    Sunday, June 18, 2017 6:08 PM
  • Ok and so will this:

    $a = $xml.unattend.settings.Where({$_.pass -eq "specialize" -and $_.component.name -eq "Networking-MPSSVC-Svc"})

    But it does not return a correct object for updating. We need a node object.

    This gets us s node with correct selectors.

    $node = $xml.SelectSingleNode('//settings[@name="specialize"]/component[@name="Networking-MPSSVC-Svc"]')


    \_(ツ)_/


    • Edited by jrv Sunday, June 18, 2017 6:39 PM
    Sunday, June 18, 2017 6:35 PM
  • This is the only safe way to alter an XML document with no ambiguity.

    [xml]$xml = @'
    <unattend 
    	xmlns="urn:schemas-microsoft-com:unattend" 
    	xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State"
    	>
    	<settings pass="specialize">
    		<component 
    				name="Microsoft-Windows-Shell-Setup" 
    				processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" 
    				language="neutral" versionScope="nonSxS" 
    				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    			>
    			<CopyProfile>true</CopyProfile>
    			<ComputerName>Test01</ComputerName>
    		</component>
            <component 
    				name="Networking-MPSSVC-Svc" 
    				processorArchitecture="amd64" 
    				publicKeyToken="31bf3856ad364e35" 
    				language="neutral" versionScope="nonSxS" 
    				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    			>
                <FirewallGroups>
                    <FirewallGroup wcm:action="add" wcm:keyValue="RemoteDesktop">
                        <Active>true</Active>
                        <Profile>all</Profile>
                        <Group>@FirewallAPI.dll,-28752</Group>
                    </FirewallGroup>
                </FirewallGroups>
                <DomainProfile_LogDroppedPackets>true</DomainProfile_LogDroppedPackets>
                <PrivateProfile_LogDroppedPackets>true</PrivateProfile_LogDroppedPackets>
                <PublicProfile_LogDroppedPackets>true</PublicProfile_LogDroppedPackets>
                <PublicProfile_LogSuccessfulConnections>true</PublicProfile_LogSuccessfulConnections>
                <PrivateProfile_LogSuccessfulConnections>true</PrivateProfile_LogSuccessfulConnections>
                <DomainProfile_LogSuccessfulConnections>true</DomainProfile_LogSuccessfulConnections>
            </component>
    	</settings>
        <settings pass="oobeSystem">
        </settings>
    </unattend>
    '@
    
    $ns = @{
    	df  = "urn:schemas-microsoft-com:unattend"
    	xsi="http://www.w3.org/2001/XMLSchema-instance"
    	wcm="http://schemas.microsoft.com/WMIConfig/2002/State"
    }
    $xpath = '//df:unattend/df:settings[@pass="specialize"]/df:component[@name="Microsoft-Windows-Shell-Setup"]'
    $node = $xml | Select-Xml -XPath $xpath -Namespace $ns
    $node.Node.ComputerName = 'Test02'
    
    # it does change the basic XML
    $xml.unattend.settings[0].component[0].ComputerName
    Test02

    Using "Where" returns an extracted object that cannot be used to alter the original object.  This is true of many Net types such as ADO.Net types. SharePoint and IIS.  The objects data is useful but no longer connected to the object.  It is not a reference whereas using XPath methods returns a reference to the object which can be changed and it will be reflected in the original object.


    \_(ツ)_/


    • Edited by jrv Sunday, June 18, 2017 7:06 PM
    Sunday, June 18, 2017 7:06 PM
  • Ok and so will this:

    $a = $xml.unattend.settings.Where({$_.pass -eq "specialize" -and $_.component.name -eq "Networking-MPSSVC-Svc"})

    But it does not return a correct object for updating. We need a node object.

    Ok, so by using ".Where()" it does not connect the objects properly back to the original one, right?

    But that sill does not explain why

    $xmlDoc.unattend.settings.Where({$_.pass -eq "specialize"}).component.Where({$_.name -eq "Microsoft-Windows-Shell-Setup"} | Where-Object {$true}).ComputerName = "Test02";

    would restore the object reverence. It just seams bugged to me. And if it is not bugged, I'm just not understandig what's going on here.

    Sunday, June 18, 2017 7:49 PM
  • But that sill does not explain why

    $xmlDoc.unattend.settings.Where({$_.pass -eq "specialize"}).component.Where({$_.name -eq "Microsoft-Windows-Shell-Setup"} | Where-Object {$true}).ComputerName = "Test02";

    would restore the object reverence. It just seams bugged to me. And if it is not bugged, I'm just not understandig what's going on here.

    It does not and executes with errors on any system.

    PS D:\scripts> $xmlDoc.unattend.settings.Where({$_.pass -eq "specialize"}).component.Where({$_.name -eq "Microsoft-Windo
    ws-Shell-Setup"} | Where-Object {$true}).ComputerName = "Test02";
    At line:1 char:122
    + ... component.Where({$_.name -eq "Microsoft-Windows-Shell-Setup"} | Where ...
    +                                                                  ~
    Missing ')' in method call.
    At line:1 char:145
    + ...  -eq "Microsoft-Windows-Shell-Setup"} | Where-Object {$true}).Compute ...
    +                                                                 ~
    Unexpected token ')' in expression or statement.
        + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : MissingEndParenthesisInMethodCall
    
    PS D:\scripts>

    Somewhere you  may have crated a copy of  $xmlDoc.

    Here is the PS parser showing the syntax error:

    Above the black mark on the right is the marker for the syntax error.


    \_(ツ)_/

    Sunday, June 18, 2017 8:31 PM
  • Be sure you have the latest XML version and Net version.

    PS D:\scripts> dir ([xml]).Module.FullyQualifiedName | select -expand VersionInfo|fl
    
    
    OriginalFilename  : System.Xml.dll
    FileDescription   : .NET Framework
    ProductName       : Microsoft® .NET Framework
    Comments          : Flavor=Retail
    CompanyName       : Microsoft Corporation
    FileName          : C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll
    FileVersion       : 4.6.1586.0 built by: NETFXREL2
    ProductVersion    : 4.6.1586.0
    IsDebug           : False
    IsPatched         : False
    IsPreRelease      : False
    IsPrivateBuild    : True
    IsSpecialBuild    : False
    Language          : English (United States)
    LegalCopyright    : © Microsoft Corporation.  All rights reserved.
    LegalTrademarks   :
    PrivateBuild      : DDBLD400
    SpecialBuild      :
    FileVersionRaw    : 4.6.1586.0
    ProductVersionRaw : 4.0.30319.0
    


    \_(ツ)_/

    Sunday, June 18, 2017 9:13 PM
  • Somewhere you  may have crated a copy of  $xmlDoc.

    Here is the PS parser showing the syntax error:

    Above the black mark on the right is the marker for the syntax error.


    \_(ツ)_/

    Ok, that's my fault, there was a typo in the command, it should be:

    ($xmlDoc.unattend.settings.Where({$_.pass -eq "specialize"}).component.Where({$_.name -eq "Microsoft-Windows-Shell-Setup"}) | Where-Object {$true}).ComputerName = "Test02";

    XML and .Net Version:

    PS C:\Users\Administrator\Desktop> dir ([xml]).Module.FullyQualifiedName | select -expand VersionInfo|fl
    
    
    OriginalFilename  : System.Xml.dll
    FileDescription   : .NET Framework
    ProductName       : Microsoft® .NET Framework
    Comments          : Flavor=Retail
    CompanyName       : Microsoft Corporation
    FileName          : C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll
    FileVersion       : 4.6.1586.0 built by: NETFXREL2
    ProductVersion    : 4.6.1586.0
    IsDebug           : False
    IsPatched         : False
    IsPreRelease      : False
    IsPrivateBuild    : True
    IsSpecialBuild    : False
    Language          : Englisch (Vereinigte Staaten)
    LegalCopyright    : © Microsoft Corporation.  All rights reserved.
    LegalTrademarks   : 
    PrivateBuild      : DDBLD400
    SpecialBuild      : 
    FileVersionRaw    : 4.6.1586.0
    ProductVersionRaw : 4.0.30319.0

    • Edited by agowa338 Sunday, June 18, 2017 10:04 PM shorten quote
    Sunday, June 18, 2017 10:01 PM
  • Interesting.  I have no explanation for that.  IN any case I almost never approach XML outside of XPath because it is the only way to enforce the schema and it is the only reliable way to find and update the correct node.

    Perhaps it is a bug.  I really think the object just isn't really adapted well to PowerShell.  If you thin it is a bug then post it in UserVoice to see what responses you may get.


    \_(ツ)_/

    Sunday, June 18, 2017 11:02 PM
  • Done: https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/19640311-bug-powershell-xml-node-assignment-with-where-met
    Monday, June 19, 2017 7:55 AM