我试图在设定日期之后导出一个文档修改文件列表,包括它的所有者,使用Get-ChildItem
进行递归扫描。
由于某些原因,我无法将其移植到文件/csv:
$Location2 = "\\fs01\DATAIT"
$loc2 ="melb"
cd $Location2
Get-ChildItem -Recurse | Where-Object { $_.lastwritetime -gt [datetime]"2017/05/01" } | foreach { Write-Host $_.Name "," $_.lastwritetime "," ((get-ACL).owner) } > c:\output\filelisting-$loc2.txt
这里的PowerShell大师中有谁能给我一点启发吗?
发布于 2017-06-02 05:54:02
代码的问题在于,您使用的是Write-Host
,它显式地将输出发送到控制台(然后不能将输出重定向到其他地方)。快速修复如下:
Get-ChildItem -Recurse | Where-Object { $_.lastwritetime -gt [datetime]"2017/05/01" } | foreach { "$($_.Name),$($_.lastwritetime),$((get-ACL).owner)" } > filelisting-$loc2.txt
这会将字符串输出到标准输出(相当于使用Write-Output
)。我把它变成了一个字符串,其中包含了您希望通过在双引号字符串中使用子表达式运算符$()
来访问的变量。在这样的字符串中,这个操作符是访问对象属性或执行其他cmdlet/复杂代码(基本上不是简单的$variable)所必需的。
您可以通过创建一个对象结果来进一步改进代码,然后允许您利用管道中的其他cmdlet,如Export-CSV
。我建议这样做:
Get-ChildItem -Recurse | Where-Object { $_.lastwritetime -gt [datetime]"2017/05/01" } | ForEach-Object {
$Properties = [Ordered]@{
Name = $_.Name
LastWriteTime = $_.LastWriteTime
Owner = (Get-ACL).Owner
}
New-Object -TypeName PSObject -Property $Properties
} | Export-CSV $Loc2.csv
这将创建您想要的属性的哈希表@{}
,然后使用该哈希表使用New-Object
创建一个PowerShell对象。然后,该对象返回到标准输出,标准输出进入管道,因此当ForEach-Object循环结束时,所有对象都被发送到Export-CSV
,然后将其正确地作为CSV输出(因为它接受对象输入)。
[Ordered]
需要PowerShell 3或更高版本。如果您使用的是PowerShell 2,请删除它。它只是按照定义的顺序来保持对象内属性的顺序。https://stackoverflow.com/questions/44320630
复制相似问题