从PowerShell命令输出创建XML文件

3

我对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个回答

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=...}


啊,我在我收到的用于 SQL Server 的 PS 脚本中看到过它的使用。那就是魔法所在。那么,为了我的理解,@{} 是一个哈希表?我应该使用什么术语来查找有关其使用的信息,也许是在 Select-object 下面? - user847990
太棒了!这也解决了我下一个任务,即收集每个文件的ACL信息。爱死这些东西了!!! - user847990

0

根据Josh Einstein的回答和我在评论中提供的链接,另一个回答是正确的方法。但是还有另一种方法可以将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

所以你添加了拉取完整的用户帐户,包括域名/主机名?如果我使用XML文件作为基线来比较目录的快照以捕获所做的更改,这会有什么影响吗? - user847990
@MeltonDBA - 我不太明白你的问题,但是从上面生成的xml应该与另一种方式生成的相同。 - manojlds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接