Я пытаюсь создать сценарий удаления узла 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".При локальном запуске он успешно удалил весь узел папки, а удаленно - нет.