Редактирование XML-содержимого с помощью PowerShell, работающего локально, но не через Invoke-Command - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь создать сценарий удаления узла XML с помощью PowerShell из 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

Iдобавлена ​​загрузка операторов Out-File для создания журнала на удаленном компьютере, чтобы увидеть, как обстоят дела во время выполнения сценария.Я вижу, что $FolderName передается правильно, затем я получаю:

Entering loop
Folder = System.Xml.XmlElement

XMLUserName =
User entry not found?
End loop

Если я получу его на Out-File строку Get-Content, он успешно прочитает файл и сохранит его в журнале,таким образом, файл .xml читается успешно.

Если я скопирую приведенный выше код на удаленный сервер и запускаю его непосредственно оттуда без оператора Invoke-Command, а затем вручную передал значение $FolderName, онработает нормально и удаляет узел XML, как и ожидалось.

Так что я не уверен, что происходит по-другому, когда он запускается удаленно.

Редактировать: По запросу, вот пример формата XML:accessaged.

<?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 голосов
/ 07 февраля 2019

Обнаружил проблему ... сам код был по существу в порядке, но я не согласен с тем фактом, что при работе с XML PowerShell по существу становится чувствительным к регистру.

Так, например, когда фактическая запись папки в XML является «MyFolder», и я установил $ FolderName как «myfolder», в любой другой ситуации сравнения $ FolderName -eq «MyFolder» будет истинным, но не тогда, когда«MyFolder» выбран из XML.

...