我正在尝试使用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-File
行Get-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”。在本地运行时,它成功删除了整个“文件夹”节点,但在远程却没有。
答案 0 :(得分:0)
发现了问题……代码本身基本上是好的,但是我一直在冒犯以下事实:在处理XML时,PowerShell本质上区分大小写。
例如,在XML的实际文件夹条目为“ MyFolder”的情况下,并且我将$ FolderName设置为“ myfolder”,在任何其他比较情况下,$ FolderName -eq“ MyFolder”将为true,但当“ MyFolder”为true时是从XML中选择的。