【问题标题】:Get-Content, looping through directories and writing to CSV获取内容,遍历目录并写入 CSV
【发布时间】:2026-02-15 01:15:01
【问题描述】:

我有一组子目录,每个子目录都包含一个带有 .pub 扩展名的文件,其中包含一个 SSH 密钥。然后我需要将此密钥导入 AD(这部分是通过 CSV 工作的)。

现在我有这个工作脚本,我将 SSH 密钥从 CSV 文件导入到 AD 对象,这工作正常。

Import-Module activedirectory

Import-Csv "C:\Script\SSH Keys\users.csv" | ForEach-Object {
     
     Get-ADUser -Identity $_.SamAccountName
     Set-ADUser $_.SamAccountName -add @{'altsecurityidentities'=$_.altSecurityIdentities}

}

CSV 很简单,如下所示:

SamAccountName altSecurityIdentities
User1 ssh-123123123123XYZ
User2 ssh-234234234234XYZ

SamAccountName altSecurityIdentities 用户1 ssh-123123123123XYZ 用户2 ssh-234234234234XYZ

现在我的想法是进一步自动化,并遍历这些子文件夹并使用 Get-Content 读取内容,然后将这些密钥写入 CSV 文件。

到目前为止,我可以从一个文件中获取内容并将其写入 CSV

Get-Content -Path "D:\Script\SSH Keys\1\*.pub"| Out-File -FilePath "D:\Script\SSH Keys\users.txt" -Append

我有 2 个问题 - 任何指针都会有所帮助

  1. 如何遍历子目录(创建一个 foreach)以获取所述子目录中所有文件的内容?

  2. 如何写入 csv 中的特定部分?假设文件所在的子文件夹与上表中的 SamAccountName 同名。有什么办法可以匹配这些吗?

C:\SSH\User1\key.pub

C:\SSH\User2\key.pub

干杯

【问题讨论】:

    标签: powershell loops csv


    【解决方案1】:

    具有现有 ssh id 的 csv 文件来自哪里?它是具有您需要使用的数据的东西,还是只是您手动将数据拼凑在一起的文件?我问的原因是我不确定是否有必要。

    这是在 c:\ssh 中递归检查 pub 文件的代码

    Get-ChildItem 'C:\SSH' -Filter *.pub -Recurse |
        ForEach-Object {
            [PSCustomObject]@{
                SamAccountName        = ($_.FullName -split '\\')[2]
                Path                  = $_.FullName
                altSecurityIdentities = Get-Content -Raw $_.FullName
            }
        }
    

    它将输出类似于下面的结果,您可以将其通过管道传输到Export-Csv,或者您可以直接通过管道传输到现有的Foreach-Object 循环。

    SamAccountName Path                      altSecurityIdentities
    -------------- ----                      ---------------------
    charley        C:\ssh\charley\id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDdiNcLyUwpqp75YbCjL44Bfc+vle3OMVEgoH9eBrfLo… 
    daniel         C:\ssh\daniel\id_rsa.pub  ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDdiNcLyUwpqp75YbCjL44Bfc+vle3OMVEgoH9eBrfLo… 
    tony           C:\ssh\tony\id_rsa.pub    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDdiNcLyUwpqp75YbCjL44Bfc+vle3OMVEgoH9eBrfLo…
    

    SamAccountName 属性不是实际的 SamAccountName,除非该文件夹实际上包含一个 SamAccountName,它听起来可能来自您的帖子。我假设“User1”和“User2”是有效的 SamAccountNames。

    如何写入 csv 中的特定部分?假设文件所在的子文件夹与 SamAccountName 同名 在上表中。有什么办法可以匹配这些吗?

    C:\SSH\User1\key.pub

    C:\SSH\User2\key.pub

    如果这是一个正确的假设,那么您可以看到直接从 C:\SSH 文件夹获取的输出具有 SamAccountName 和 altSecurityId,我相信这就是您所需要的,所以这就是为什么我想知道您最初提到的 csv在这一点上甚至是必要的,或者它如何适合解决方案。请随时澄清/评论,我可以相应地修改我的答案。

    编辑 我想这不是假设,您声明路径实际上具有 SamAccountName 名称:) 只要路径是您所说的 c:\ssh\someuser 或可能是 c:\somefolder\someuser,上面的代码应该正确获取用户/samaccountname,就像只要标记为 someuser 的文件夹是第 2 级。

    【讨论】:

    • 非常感谢您来到这里。这正是我想要的!它给了我正确的结果,现在我正在分析它以完全理解它。将 Export-Csv 管道连接到它也像一个魅力,比 File-Out 方法更好;)您的编辑是正确的,它们是实际的 SamAccountName 名称,我们在共享上为每个用户组织 SSH 密钥的文件夹结构.