【问题标题】:Get LastAccessTime for each subfolders in a csv folder list获取 csv 文件夹列表中每个子文件夹的 LastAccessTime
【发布时间】:2020-12-23 20:45:46
【问题描述】:

我有一个这样的 csv ($HomeDir) 文件:

用户、评论、HomeDir 用户 1,帐户 1,c:\文件夹 1 用户 2,帐户 2,c:\文件夹 2 用户 3,帐户 3,c:\文件夹 3

我使用以下代码成功获取“HomeDir”列中每个子文件夹的 LastAccessTime:

$csv = 导入-CSV $HomeDir foreach($csv.HomeDir 中的 $folder){ Get-ChildItem $folder -ErrorAction SilentlyContinue | ? {$_.PSIsContainer -eq "True"} | 选择对象全名,@{Name='LastAccessTime';表达式={$_.LastAccessTime.ToString('yyyyMMdd')}} | 排序对象-降序-属性 LastAccessTime | 导出-Csv $newcsv -NoTypeInformation -Append }

$newcsv 的结果是:

"全名","上次访问时间" "c:\folder1\Sub1","20201223" "c:\folder1\Sub1a","20201223" "c:\folder1\Sub1b","20201223" "c:\folder2\Sub2","20201218" "c:\folder2\Sub2a","20201218" "c:\folder3\Sub3","20201212" "c:\folder3\Sub3a","20201215" "c:\folder3\Sub3b","20181215" "c:\folder3\Sub3c","20201011"

问题是:有没有办法根据相应的“用户”列分配相关用户? 对我来说得到这样的输出也足够了

“用户”、“全名”、“上次访问时间” "user1","c:\felder1\Sub1","20201223" "user1","c:\folder1\Sub1a","20201223" "user1","c:\folder1\Sub1b","20201223" "user2","c:\folder2\Sub2","20201218" "user2","c:\folder2\Sub2a","20201218" "user3","c:\folder3\Sub3","20201212" "user3","c:\folder3\Sub3a","20201215" "user3","c:\folder3\Sub3b","20181215" "user3","c:\folder3\Sub3c","20201011"

提前致谢

【问题讨论】:

  • 请允许我给你一个标准的建议给新手:如果你accept 一个答案,你将帮助未来的读者,向他们展示解决了你的问题的方法。要接受答案,请单击答案左侧大数字下方的大 ✓ 符号(您将获得 2 点声望)。如果您至少有 15 个声望点,您还可以投票给其他有用的答案(也可以选择接受的答案)。如果您的问题尚未解决,请提供反馈,或者,如果您自己找到了解决方案,请self-answer

标签: powershell csv


【解决方案1】:

不要在循环之前将 HomeDir 属性拉出,只需在循环内引用它并将 Users 属性添加到您的 Fullname 和 LastAccessTime 属性。

$properties = @{Name='User'; Expression={$user}},
              'FullName',
              @{Name='LastAccessTime'; Expression={$_.LastAccessTime.ToString('yyyyMMdd')}}

Import-Csv $HomeDir | ForEach-Object {
    $user = $_.users
    Get-ChildItem $_.HomeDir -ErrorAction SilentlyContinue | 
        Where-Object {$_.PSIsContainer -eq "True"} | 
            Select-Object $properties |
                Sort-Object -Descending -Property LastAccessTime
} | Export-Csv $newcsv -NoTypeInformation

为了便于阅读,我预先将属性放入了一个变量中。此外,如果您使用的是 powershell 版本 3 或更高版本,则可以使用 -Directory 参数代替 $_.PSIsContainer -eq $true。最后,如果您使用 Foreach-Object 而不是 foreach 循环,您可以通过管道导出,而不必使用-Append 多次打开和关闭文件。

$properties = @{Name='User'; Expression={$user}},
              'FullName',
              @{Name='LastAccessTime'; Expression={$_.LastAccessTime.ToString('yyyyMMdd')}}

Import-Csv $HomeDir | ForEach-Object {
    $user = $_.users
    Get-ChildItem $_.HomeDir -Directory -ErrorAction SilentlyContinue |  
        Select-Object $properties | Sort-Object -Descending -Property LastAccessTime
} | Export-Csv $newcsv -NoTypeInformation

【讨论】:

  • 当 FullName 列不存在时,我如何继续并将错误放入?
  • 如果 homedir 不存在,你想把“不存在”之类的东西放在那里吗?
  • 是的。正确的!不存在或拒绝访问。这些是最常见的错误。
【解决方案2】:

我建议我的版本。

$HomeDir="c:\temp\input.csv"
$newcsv="c:\temp\output.csv"

Import-Csv $HomeDir | %{

#save user name
$User=$_.Users

Get-ChildItem $_.HomeDir -ErrorAction SilentlyContinue -Directory | 
            Sort LastAccessTime -Descending |
                select @{N='Users'; E={$User}}, FullName,  @{N='LastAccessTime'; E={$_.LastAccessTime.ToString('yyyyMMdd')}}

} |  Export-Csv $newcsv -NoType

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 2019-05-18
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多