2016-04-05 68 views
0

我有一个导入CSV的脚本,将列表与AD进行比较并创建用户名和密码。该脚本开始时是这样的:在PowerShell中导出对象

$CSV = Import-CSV C:\Scripts\Add_AD_Users.csv 

$CSV | ForEach-Object{ 
    if(user does exist){ 
     # skip it 
    } 
    elseif(user doesn't exist){ 
     # create user and export password, email, and username to csv. 
    } 

elseif发言中,我想获得当前ForEach-object“对象”,并导出为CSV。那可能吗? CSV包含3个我想采用的标题$_.SamAccountName $_.EmailAddress $_.Password

有没有办法做到这一点,以便我只有新创建的用户?这不能通过Get-Aduser上的-PassThru来完成。

回答

0

最快的方法是使用散列表与PSCustomObject创建加速器相结合。

$userToExport = [PSCustomObject]@{ 
    'sAMAccountName'=$_.SamAccountName 
    'Email Address'=$_.EmailAddress 
    'Password'=$_.Password 
    # Each element in '' will be the column header, in order declared. 
} 

$userToExport | Export-CSV .\absolutefilepath.csv -Append -NoTypeInformation 

-NoTypeInformation将对象类型从对象中剥离出来,因此它不会将它打印到CSV中。 -Append将格式化CSV(如果为空),并将当前添加的用户添加到csv,即使它是之前创建的。

+0

我遇到的一个问题是“Export-CSV:无法处理参数,因为参数”name“的值无效更改”name“参数的值并再次运行该操作 在行: 16 char:37 + $ userToExport | Export-CSV -Append -Force -Path C:\ Scripts \ C ... + ~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CategoryInfo:InvalidArgument:(:) [Export-Csv], .ExportCsvCommand“如果导出已被删除,则可以运行 – ADK

+0

如果这些列已经存在,则重新创建该对象看起来很浪费。 – Matt

+0

@Matt不确定你的意思?创建要导出的自定义对象意味着您可以控制CSV中的值,列标题的命名方式,它们的顺序等。它打包CSV“条目”然后发送它的过程被添加到CSV。您可以验证创建的对象,然后将其导出到CSV,而不是查看输入CSV并复制信息。 –

0

这不是非常漂亮,但我会把它放到where子句中,然后使用Select-Object输出到CSV。

$CSV | 
    Where-Object{$result=try{Get-ADUser $_.samaccountname}catch{$false};!$result} | 
    Select-Object SamAccountName, EmailAddress, Password | 
    Export-Csv -NoTypeInformation $path 

既然你不处理存在使用位置对象,使他们不继续向下管让测试用户。 Unfortunately you cannot use -ErorrAction这会更好,所以我们测试try catch块的结果。

从外观上看,您的CSV文件已经有SamAccountNameEmailAddressPassword列,所以我们只是通过管道发送这些列。