使用where-object的Powershell脚本编写

6
我正在尝试编写一个用于Exchange管理Shell的PowerShell脚本,将CSV文件中的联系人列表导入到分配组中。
我开始使用:
Import-csv C:\filename.csv | forEach-Object {New-MailContact .......}

这个功能很好用,不过我的 csv 文件中有一些条目的电子邮件地址为空,因此创建新联系人时失败了,因为 ExternalEmailAddress 是空白的。所以,我尝试了:
Import-csv C:\filename.csv | ForEach-Object { Where-Object {$_.ExternalEmailAddress -ne "" } | New-MailContact -Name $_.Name -ExternalEmailAddress $_.ExternalEmailAddress....}

但似乎这并没有起作用 - 它没有过滤掉带有空电子邮件地址的条目。
我做错了什么?
2个回答

9

我认为在使用ForEach-Object之前,您可能需要使用Where-Object来过滤沿管道传递的对象。

根据New-MailContact cmdlet支持的内容,您可以直接将结果导入其中,或者您可能需要逐个传递它们。

一次性全部传递(不使用ForEach-Object):

Import-csv C:\filename.csv | Where-Object {$_.ExternalEmailAddress -ne "" } | New-MailContact -Name $_.Name -ExternalEmailAddress $_.ExternalEmailAddress }

逐一处理 (使用 ForEach-Object):

Import-csv C:\filename.csv | Where-Object {$_.ExternalEmailAddress -ne "" } | ForEach-Object { New-MailContact -Name $_.Name -ExternalEmailAddress $_.ExternalEmailAddress }

不,我尝试过了,但是出现了错误 -New-MailContact : 无法将参数“Name”绑定到参数,因为它为空。 在第1行第106个字符处:
  • Import-csv c:\FloridaBarTest.csv | Where-Object {$.ExternalEmailAddress -ne ""} | New-MailContact -Name <<<< $.Name -FirstName $.FirstName -LastName $.FirstName -ExternalEmailAddress $_.ExternalEmailAddress -OrganizationalUnit "FloridaBarContacts" 看起来好像csv内容没有通过管道传递。
- Ken Ray
你收到了哪些错误?你能否更新问题并提供更多信息? - Scott Saad
通过管道传递PSObject的成员之前进行验证是一个好习惯,以确保您正在访问它们。为此,请将Import-Csv的结果传递到Get-Member。 - Scott Saad
不确定 New-MailContact 命令在管道上支持什么,因此我更新了答案并列出了可能性。 - Scott Saad

1

可能实际上有一个空格或其他一些空白字符,它们并不是null。也许像这样:

 Import-csv C:\filename.csv | Where-Object {$_.ExternalEmailAddress -match "^\S+$" } | New-MailContact -Name $_.Name -ExternalEmailAddress $_.ExternalEmailAddress....}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接