PowerShell: использование класса с ForEach - PullRequest
0 голосов
/ 17 марта 2020

Отказ от ответственности: я довольно плохо знаком с PowerShell и сценариями в целом

Я пытаюсь l oop просмотреть список папок, записать их имена, разделить и обрезать имена на отдельные объекты и записать вывод в два отдельных файла .CSV. У меня есть функция basi c, чтобы захватить информацию, которую я хочу, и экспортировать, но я хочу более краткую функцию.

Want: Чтобы захватить всю информацию из имени папки в отдельные объекты. Если ошибок нет, запишите указанную информацию о пользователе и выведите в файл downloads \ $ folderName.csv. Затем, если произойдет ошибка, поместите счетчик, дату, ID и techId в другой массив, который будет выводиться в CSV-файл "downloads \ $ foldername_badID.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". Свойство System.Object [] не найдено для объекта TermFolderClass. Доступное свойство: [termId], [date], [techId] В строке: 22 char: 9 + $ splitFolder + = @ ([TermFolderClass] @ {date = $ line.Split (".") [0] .. . + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ + CategoryInfo: InvalidArgument: (:) [], RuntimeException + FullyQualifiedErrorId: ObjectCreationError

Невозможно создать объект типа "TermFolderClass". System.Object [] свойство не найдено для объекта TermFolderClass. Доступно следующее свойство: [termId], [date], [techId]

1 Ответ

1 голос
/ 17 марта 2020

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 для сбора недопустимых TermIds.

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

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

3) Наконец, вы можете сохранить неправильные TermIds аналогично:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...