PowerShell:将类与ForEach一起使用



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

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

想要:将文件夹名称中的所有信息捕获到单个对象中。如果没有错误,请捕获指定的用户信息并输出到downloads\$folderName.csv。然后,如果发生错误,请将计数、日期、ID和技术ID放入另一个数组中,该数组将输出到"downloads\$oldername_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:tempfoldernames.txt
$File= Get-Content "C:tempfoldernames.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:USERNAMEdownloads$termFolder.csv" -NoTypeInformation
$badId | Export-CSV "C:Users$env:USERNAMEdownloads$termFolder-invalid_ids.csv" -NoTypeInformation

我试图合并的内容(参考(:

$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:tempfoldernames.txt
$File= Get-Content "C:tempfoldernames.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:USERNAMEdownloads$termFolder.csv" -NoTypeInformation
$badId | Export-CSV "C:Users$env:USERNAMEdownloads$termFolder-invalid_ids.csv" -NoTypeInformation

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

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

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

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

$items = Import-Csv -Path C:tempfoldernames.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

最新更新