【问题标题】:PowerShell: Using Class with ForEachPowerShell:将类与 ForEach 一起使用
【发布时间】:2020-03-17 14:38:55
【问题描述】:

免责声明:我对 PowerShell 和一般脚本很陌生

我正在尝试遍历文件夹列表,捕获它们的名称,将名称拆分并修剪为单个对象,并将输出写入两个单独的 .CSV 文件。我有基本的功能来捕获我想要的信息并导出,但我想要一个更简洁的功能。

想要:将文件夹名称中的所有信息捕获到单个对象中。如果没有错误,捕获指定的用户信息并输出到 downloads\$folderName.csv。然后,如果发生错误,请将计数、日期、ID 和 techId 放入另一个数组中,该数组将输出到“downloads\$foldername_badID.csv”CSV 文件。

我目前所拥有的:

$date= @()
$termId= @()
$techId=@()
$badId= @()

$termFolder= "2018_Completed"

Get-ChildItem -Path "$path\$termFolder" | Where-Object{ $_.PSIsContainer } | Select-Object Name | Format-Table -Property * -AutoSize | Out-String -Width 4096 | Out-File C:\temp\foldernames.txt

$File= Get-Content "C:\temp\foldernames.txt"

foreach( $line in $File ){
    $date+= @($line.Split(".")[0])
    $termId+= @($line.Split(".").Trim()[1])
    $techId+= @($line.Split(".").Trim()[2])

}
$termId | ForEach-Object {
    try{
        Get-ADUser $_ -Properties *
    }
    catch{
        $badId+= [pscustomobject]@{

            BadID = $_
        }
    }
} | Select-Object CN, EmployeeID, EmailAddress, SamAccountName | Export-Csv "C:\Users\$env:USERNAME\downloads\$termFolder.csv" -NoTypeInformation
$badId | Export-CSV "C:\Users\$env:USERNAME\downloads\$termFolder-invalid_ids.csv" -NoTypeInformation

我想要合并的内容 (ref):

$date= @()
    $termId= @()
    $techId=@()
    $badId= @()

    class TermFolderClass {
        [string]$termId
        [int]$date
        [string]$techId;
    }

    $termFolder= "2018_Completed"

    Get-ChildItem -Path "$path\$termFolder" | Where-Object{ $_.PSIsContainer } | Select-Object Name | Format-Table -Property * -AutoSize | Out-String -Width 4096 | Out-File C:\temp\foldernames.txt

    $File= Get-Content "C:\temp\foldernames.txt"

    foreach( $line in $File ){
        # $date+= @($line.Split(".")[0])
        # $termId+= @($line.Split(".").Trim()[1])
        # $techId+= @($line.Split(".").Trim()[2])

        $splitFolder+= @([TermFolderClass]@{date= $line.Split(".")[0]; termId= $line.Split(".").Trim()[1]; $techId= $line.Split(".").Trim()[2]})

    }
    $termId | ForEach-Object {
        try{
            Get-ADUser $_ -Properties *
        }
        catch{
            $badId+= [pscustomobject]@{

                BadID = $_
            }
            # Pause
        }
    } | Select-Object CN, EmployeeID, EmailAddress, SamAccountName | Export-Csv "C:\Users\$env:USERNAME\downloads\$termFolder.csv" -NoTypeInformation
    $badId | Export-CSV "C:\Users\$env:USERNAME\downloads\$termFolder-invalid_ids.csv" -NoTypeInformation

目前我在尝试运行合并版本时遇到此错误:

无法创建“TermFolderClass”类型的对象。未找到 TermFolderClass 的 System.Object[] 属性 目的。可用属性为: [termId ] 、 [date ] 、 [techId ] 在行:22 字符:9 + $splitFolder+= @([TermFolderClass]@{date= $line.Split(".")[0] ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [], RuntimeException + FullyQualifiedErrorId : ObjectCreationError

无法创建“TermFolderClass”类型的对象。未找到 TermFolderClass 的 System.Object[] 属性 目的。可用属性为: [termId ] 、 [date ] 、 [techId ]

【问题讨论】:

  • 当您使用Get-ChildItem -Path "$path\$termFolder" 时,您没有事先定义$path$path的值从何而来?
  • 我排除了路径,因为它是内部服务器。 $path 用于显示路径的占位符变量。

标签: function powershell


【解决方案1】:

1) "C:\temp\foldernames.txt" 是点分隔值文件 (DSV)。您可以使用 Import-Csv 命令读取它。

$items = Import-Csv -Path C:\temp\foldernames.txt -Delimiter '.' -Header Date, TermId, TechId

它将被加载并自动修剪为以下结构:

Date TermId TechId ---- ------ ------ 2000-01-01 1234567890 1234567890 2000-01-02 1234567890 1234567890 2000-01-03 1234567890 1234567890

2)您可以使用ArrayList收集无效的TermId。

$badItems = New-Object -TypeName 'Collections.ArrayList'

foreach ($item in $items)
{
    try { Get-ADUser $item.TermId -Properties * }
    catch { $badItems.Add($item) | Out-Null }
}

3) 最后,您可以以类似的方式保存错误的 TermId:

$badItems | select TermId | Export-Csv -Path C:\BadItems.txt -NoTypeInformation

【讨论】:

  • 您使用 DSV 技巧让我的喜欢变得轻松了一百万倍!它现在几乎完全按预期工作。但是,$badItems 的输出包括所有项目。我将 $_ 更改为 $item.TermId 所以输出是正确的。 try{ Get-ADUser $item.TermId -Properties * | Select-Object CN, EmployeeID, EmailAddress, SamAccountName | Export-Csv "C:\Users\$env:USERNAME\downloads\$termFolder.csv" -NoTypeInformation -Append } catch{ $badItems.Add($item) | Out-Null }
猜你喜欢
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 2016-04-02
  • 2011-06-03
相关资源
最近更新 更多