我试图脚本去除使用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>
因此,例如在脚本中我指定$文件夹名称为“文件夹2”。当本地运行它成功卸下的整个文件夹节点,远程它没有。
发现问题...代码本身基本上是好的,但我一直在下降的,与XML打交道时,PowerShell的实质上成为区分大小写的事实犯规。
因此,例如其中的XML实际文件夹条目是“MyFolder文件”,我设置$文件夹名称为“MyFolder文件”,在任何其他情况相比$文件夹名当量“MyFolder文件”将是真实的,而不是在选自“MyFolder文件” XML。