首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Powershell Get-ChildItem,与所有者在日期上进行过滤,并导出到txt或csv。

Powershell Get-ChildItem,与所有者在日期上进行过滤,并导出到txt或csv。
EN

Stack Overflow用户
提问于 2017-06-02 04:09:49
回答 1查看 1.3K关注 0票数 1

我试图在设定日期之后导出一个文档修改文件列表,包括它的所有者,使用Get-ChildItem进行递归扫描。

由于某些原因,我无法将其移植到文件/csv:

代码语言:javascript
运行
复制
$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大师中有谁能给我一点启发吗?

EN

回答 1

Stack Overflow用户

发布于 2017-06-02 05:54:02

代码的问题在于,您使用的是Write-Host,它显式地将输出发送到控制台(然后不能将输出重定向到其他地方)。快速修复如下:

代码语言:javascript
运行
复制
 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。我建议这样做:

代码语言:javascript
运行
复制
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输出(因为它接受对象输入)。

  • 顺便提一下,下面是PowerShell的创建者关于为什么写主机被认为是有害的的有趣的文章。
  • [Ordered]需要PowerShell 3或更高版本。如果您使用的是PowerShell 2,请删除它。它只是按照定义的顺序来保持对象内属性的顺序。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44320630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档