从PowerShell命令输出创建XML文件

时间:2011-08-05 18:43:20

标签: xml powershell

我没有使用过很多XML,所以这对大多数人来说可能是一个基本问题......

我想从Get-ChildItem收集信息,并结合Get-Acl,并将其存储在XML文件中,以便稍后在PowerShell中使用。

问题:为了让我使用Get-Acl,我必须在管道中使用foreach循环,然后将对象类型更改为system.string。因此,当我将其导出到XML时,它几乎只是一个平面文件,而不是表格结构。

如何恢复表格结构?

如果我只是执行此命令,我可以获得表结构:


Get-ChildItem . -Recurse | 
Select FullName, PSIsContainer, CreationTimeUTC, LastAccessTimeUtc, Length | 
Export-Clixml .\STIGTest\Baseline_1.xml

当我执行此命令时,我得到的是平面文件:


Get-ChildItem . -Recurse | 
foreach-object {$AclOwner = (get-acl $_.pspath).owner; $_.Fullname, $_.PSIsContainer, $_.CreationTimeUtc, $_.LastAccessUtc, $_.Length, $AclOwner} | 
Export-Clixml .\STIGTest\Baseline_2.xml

我已经看到你可以将系统对象转换为字符串,但似乎无法找到我可以反过来的地方。我猜他们是否作为系统对象保留XML文件将保留表结构?

2 个答案:

答案 0 :(得分:1)

试试这个。它利用了Select-Object可以创建由表达式指定的“计算”属性这一事实。

Get-ChildItem . -Recurse | 
Select FullName,
       PSIsContainer,
       CreationTimeUTC,
       LastAccessTimeUtc,
       Length,
       @{Name='Owner';Expression={ (Get-Acl $_.PSPath).Owner }} | 
Export-Clixml .\STIGTest\Baseline_1.xml

为了清楚起见,我写了@{Name=...; Expression=...},但可以缩短为@{N=...,E=...}

答案 1 :(得分:1)

@Josh爱因斯坦的回答以及我在评论中给出的链接,另一个答案是要走的路。但是还有另一种方法可以将acl信息添加到对象本身,下面就会增加你在问题中提到的尝试:

Get-ChildItem . -recurse | 
foreach-object {$AclOwner = (get-acl $_.pspath).owner; Add-Member -input $_ -MemberType noteproperty -Name AclOwner -Value $AclOwner; $_ } | 
Select FullName, PSIsContainer, CreationTimeUTC, LastAccessTimeUtc, Length, AclOwner |
Export-Clixml .\STIGTest\Baseline_1.xml