编辑XML内容使用PowerShell通过调用命令在本地,但不工作

问题描述 投票:0回答:1

我试图脚本去除使用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>

因此,例如在脚本中我指定$文件夹名称为“文件夹2”。当本地运行它成功卸下的整个文件夹节点,远程它没有。

xml powershell invoke-command
1个回答
0
投票

发现问题...代码本身基本上是好的,但我一直在下降的,与XML打交道时,PowerShell的实质上成为区分大小写的事实犯规。

因此,例如其中的XML实际文件夹条目是“​​MyFolder文件”,我设置$文件夹名称为“MyFolder文件”,在任何其他情况相比$文件夹名当量“MyFolder文件”将是真实的,而不是在选自“MyFolder文件” XML。

© www.soinside.com 2019 - 2024. All rights reserved.