使用PowerShell在本地工作而不是通过Invoke-Command编辑XML内容

时间:2019-01-25 17:15:48

标签: xml powershell invoke-command

我正在尝试使用PowerShell从远程计算机上的.xml文件中删除XML节点的脚本。

我的Invoke-Command脚本块是:

$remoteResult = Invoke-Command -ComputerName myserver.com -ScriptBlock {
    Param($FolderName) 

    $xmlFilePath = "c:\foo\Folders.xml"
    $localLog="c:\foo\removefolder.txt"

    [XML]$XMLContent = Get-Content $xmlFilePath -Encoding UTF8
    Write-Output $FolderName | Out-File $localLog -Append
    Write-Output "Entering loop" | Out-File $localLog -Append
    foreach ($Folder in $XMLContent.Folders) {
        $XMLFolderName = $Folder.SelectSingleNode("//Name[.='$FolderName']")
        Write-Output "Folder = $folder" | Out-String | Out-File $localLog -Append
        Write-Output "XMLUserName = $XMLFolderName" | Out-File $localLog -Append
        if ($XMLFolderName.'#text' -eq $FolderName) {
            $XMLUserName.'#text' | Out-File $localLog -Append
            Write-Output "User entry found for $FolderName, removing." | Out-File $localLog -Append
            $XMLFolderName.ParentNode.ParentNode.RemoveChild($XMLFolderName.ParentNode)
        }
        Write-Output "Folder entry not found?" | Out-File $localLog -Append
    }
    Write-Output "End loop" | Out-File $localLog -Append
    $XMLContent.Save($xmlFilePath)
} -ArgumentList $remfolder *>&1

我添加了Out-File条语句,以在远程计算机上生成日志,以查看脚本执行过程中事物的状态。我可以看到$FolderName正确传递,然后得到:

Entering loop
Folder = System.Xml.XmlElement

XMLUserName =
User entry not found?
End loop

如果我将其移至Out-FileGet-Content,它将成功读取文件并将其保存到日志中,因此.xml文件将被成功读取。

如果我将上面的代码复制到远程服务器并在没有Invoke-Command语句的情况下直接从那里运行,并手动传递了$FolderName的值,则它可以正常工作并按预期方式删除XML节点

因此,我不确定在远程运行时发生了什么变化。

编辑: 根据要求,下面是一个正在访问的XML格式的示例。

<?xml version="1.0"?>
<Folders>
  <Folder>
    <Name>Folder1</Name>
    <Location>\\server.com\share$\folder\Folder1</Location>
    <Limitations />
    <Description>Folder One</Description>
    <CustomField />
    <UserPermissions />
    <GroupPermissions>
      <Permission>
        <IdentityName>Folder One</IdentityName>
        <ListRestriction>
          <Type>Deny</Type>
          <Extensions />
        </ListRestriction>
      </Permission>
    </GroupPermissions>
  </Folder>
  <Folder>
    <Name>Folder2</Name>
    <Location>\\server.com\share$\folder\Folder2</Location>
    <Limitations />
    <Description>Folder Two</Description>
    <CustomField />
    <UserPermissions>
      <Permission>
        <IdentityName>Folder Two</IdentityName>
        <ListRestriction>
          <Type>Deny</Type>
          <Extensions />
        </ListRestriction>
      </Permission>
    </UserPermissions>
    <GroupPermissions />
  </Folder>

例如,在脚本中,我将$ FolderName分配为“ Folder2”。在本地运行时,它成功删除了整个“文件夹”节点,但在远程却没有。

1 个答案:

答案 0 :(得分:0)

发现了问题……代码本身基本上是好的,但是我一直在冒犯以下事实:在处理XML时,PowerShell本质上区分大小写。

例如,在XML的实际文件夹条目为“ MyFolder”的情况下,并且我将$ FolderName设置为“ myfolder”,在任何其他比较情况下,$ FolderName -eq“ MyFolder”将为true,但当“ MyFolder”为true时是从XML中选择的。