【问题标题】:Powershell: Advanced file age searchingPowershell:高级文件年龄搜索
【发布时间】:2017-03-15 08:56:47
【问题描述】:

这是我在 Stackoverflow 中的第一篇文章,多年来我一直在阅读许多精彩的问题、答案和其他各种帖子。我从这个奇妙的社区学到了很多东西。我希望现在我已经勇敢地迈出了真正的步伐,真正投入到 powershell 中并加入这个社区,我可能能够以某种方式做出贡献!

所以我开始着手一个项目,该项目处于基本核心级别 - 列出所有超过 7 年的文件,以便他们可以在可能的情况下查看和删除。

然而,我将整个脚本分成了几个阶段。我目前卡在第 2 阶段。

我已经被困了大约 2 天,对于你们中的许多 powershell 天才来说可能只需要 10 分钟就能弄清楚!

我必须为我的愚蠢和缺乏知识而道歉,我对 powershell 脚本的经验仅限于 5 个工作日,我目前正在潜心研究书籍并学习,但我也有工作要做所以不明白学习简单的方法!

我的脚本基本上有 3 个步骤;

  1. 运行顶级 DATA 文件夹的 Get-ACL 以创建对特定文件夹具有权限的所有组的列表。然后我想要么导出这些数据,要么只保留它以供下一步使用。

  2. 根据包含标记为角色的列的 CSV 过滤收集到的信息(角色将包含文件夹管理器专有的组),并检查此排他性组的固有成员(也许最后一点需要还要再迈出一步?)

  3. 存储或导出此排他成员列表及其相关文件夹,然后用作变量以发送包含需要删除的文件列表的电子邮件。

使用下面的脚本,我基本上停留在第 2 步以及如何从 CSV(或存储的变量?)创建过滤器并将其应用于 GET-ACL foreach 循环。我可能会使用正则表达式完全错误地解决这个问题,老实说,其中大部分是复制和粘贴以及在人们完成类似任务的互联网上阅读。如果这只是从一开始就采取的愚蠢方式,我再次道歉!

我要提前感谢大家提供的所有帮助、意见和建议,我会认真听取所有意见,我会尽我所能 - 我保证!

#$RoleList = import-csv "C:\DATA\scripts\GB_CMS\CSV\datafolders_rolelist.csv"
#foreach ($Manager in $RoleList) {
#$FolderManager = $RoleList.Role

$FolderManagers = Import-Csv C:\DATA\scripts\GB_CMS\CSV\datafolders_rolelist.csv | foreach {
  New-Object PSObject -prop @{
    Folder = $_.Folder;
    Manager = $_.'Folder Manager';
    Role = $_.Role


  }
}

$Role = $FolderManagers.Role
$Role


gci "c:\DATA" | Where {$_.PSIsContainer} | get-acl |
 ForEach $_.Name {
 [regex]$regex="\w:\\\S+"
 $path=$regex.match($_.Path).Value
 $_ | select -expand access |

 $

 where {$_.identityreference -like "$Role"} |
 Select @{Name="Path";Expression={$Path}},IdentityReference
 }

谢谢, 丹尼尔。

【问题讨论】:

    标签: powershell csv automation


    【解决方案1】:

    在这里你想要什么猜测一下。例如如果你有文件夹

    C:\Data\Accounts
    C:\Data\Marketing
    C:\Data\Sales
    

    你可能有权限

    C:\Data\Accounts    {'FolderManagers-Accounts', 'Accounts', 'Directors'}
    C:\Data\Marketing   {'FolderManagers-Marketing', 'Marketing', 'Sales'}
    C:\Data\Sales       {'FolderManagers-Sales', 'Sales', 'Directors'}
    

    你的 CSV 是

    Name,  Role,                     Email
    Alice, FolderManagers-Accounts,  alice@example.com
    Bob,   FolderManagers-Marketing, bob@example.com
    

    CSV 中的一 (1) 行将清晰地映射到 ACL 中的组之一。

    你想要,从你的脚本中:

    Identify who to email about "C:\Data\Accounts"
    

    我离我有多近?

    # Import the managers. This will turn the CSV into an array of objects
    # no need to do that explicitly
    $FolderManagers = Import-Csv C:\DATA\scripts\GB_CMS\CSV\datafolders_rolelist.csv
    
    # This will be a hashtable pairing up folder names with people
    # e.g. 'C:\DATA\Accounts' -> Alice
    $FolderMap = @{}
    
    # Run through all the folders
    GetChildItem -Path "C:\Data" -Directory | ForEach-Object {
    
        # Run through the group/user ACL entries on the folder
        foreach ($group in (Get-Acl $_.FullName).Access.IdentityReference)
        {
            # Look for a matching row in the CSV
            $CsvRow = $FolderManagers | Where-Object {$_.Role -match $group}
    
            if (-not $CsvRow)
            {
                Write-Error "No manager found for folder $_"
            }
            else
            {
                # Add to the map
                # $_ converts to folder path, C:\DATA\Accounts
                # $CsvRow is the person, @{Name=Alice, Role=..., Email=...}
                $FolderMap[$_.FullName] = $CsvRow
            }
    
        }
    }
    

    那么它(FolderMap)将是

    Name                           Value                                                                                                                                    
    ----                           -----                                                                                                                                    
    C:\Data\Accounts               {Name='Alice';Role=...
    C:\Data\Marketing              {Name='Bob';Role=...
    

    你可以查询它

    $person = $FolderMap["c:\data\Accounts"]
    $person.email
    

    如果你真的想导出它,也许

    $FolderMap | ConvertTo-Json | Set-Content foldermanagers.json
    

    铌。我在脑海中写下了大部分内容,它可能不会只是运行。这是 StackOverflow 上的大问题,不是很具体的问题。


    从我的代码块自动生成的 PS 帮助链接(如果有):

    【讨论】:

    • 您好,非常感谢您的回复,请原谅我的回复延迟。我已经对此进行了测试,正如您所说,我最初在运行它时遇到了问题。我得到了这条线的问题; # 运行文件夹 foreach ($group in (Get-Acl $_).Access.IdentityReference) 上的组/用户 ACL 条目,它会产生此错误:Get-Acl : Cannot find path 'Folder1' because it does not exist .在 line:13 char:25 + foreach ($group in (Get-Acl $_).Access.IdentityReference)
    • 我今天将继续编写脚本,试图找出为什么 Get-ACL 无法从之前的 GCI 命令中获取文件夹的完整路径。由于我的 PS 知识有限,我最初看不到它,但会尝试弄清楚,当我有时我会更新我的回复。
    • 顺便说一句,您的回答通常是非常正确的,并且已经解释了我想要实现的目标,它非常有帮助,特别是在使用 foreach-object 命令时,我认为现在正在查看您的内容提供的可能是我所缺少的。
    • 糟糕。你让它工作了吗?在那个地方尝试(Get-Acl $_.FullName) 引用它的完整路径。从您的另一个问题来看,您想要的似乎是相当直接的,但并非微不足道 - 可能需要对集合和对象/管道工作有所了解才能巧妙地完成它。而这个 FolderMap 方法是我在另一个问题中试图回答的哈希表方法,它将文件夹路径映射到人 - 并且可能还需要 $FolderMap[$_.FullName] = $CsvRow ,原因与 Get-ACL 相同。 (在这里都编辑成我的答案)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多