Exchange 在线 powershell 脚本收到 "Cannot convert hashtable to an object of the following type" 错误

Exchange online powershell script receive "Cannot convert hashtable to an object of the following type" error

我正在尝试将 Exchange Online (Office 365) PowerShell 脚本放在一起,以使用命令行开关 set-clutter 批量处理邮箱,以关闭邮箱混乱功能。以下 PowerShell 命令可以 运行 用于单个邮箱:

set-clutter -identity "MailboxIdentityHere" -enable $false

我有一个包含每个邮箱身份的 CSV 文件。

我不是程序员,是脚本新手,我意识到我并不完全理解我的问题。

我已经能够将以下脚本放在一起:

$Identities = Import-csv "pathtofile\filename.csv"
foreach ($Identity in $Identities)  
{
set-clutter -identity $Identity -enable $false
}

但是,对于 CSV 文件中列出的邮箱的每次迭代,我都会重复以下错误:

Cannot process argument transformation on parameter 'Identity'. Cannot convert value "@{IDENTITY =ProjectMailbox1}" to type "Microsoft.Exchange.Configuration.Tasks.MailboxIdParameter". Error: "Cannot convert hashtable to an object of the following type: Microsoft.Exchange.Configuration.Tasks.MailboxIdParameter. Hashtable-to-Object conversion is not supported in restricted language mode or a Data section." + CategoryInfo : InvalidData: (:) [Set-Clutter], ParameterBindin...mationException + FullyQualifiedErrorId : ParameterArgumentTransformationError,Set-Clutter + PSComputerName : outlook.office365.com

根据错误消息,我相信我不明白从 CSV 文件传递​​到变量的数据类型与 commandlet 期望的数据类型不匹配。我没有足够的知识来继续或补救这个问题。

这是 CSV 文件的外观示例:

ALIAS

ProjectMailbox1
ProjectMailbox2
ProjectMailbox3
ProjectMailbox4
etc...

检查变量中的数据总是值得的。将其传输到 Get-Member 可以让您深入了解您正在使用的数据。

在这种情况下,假设 CSV 中的第一行是 ALIAS,并且您将 $Identities 传送到 Get-Member,您会看到如下内容:

[2] PS C:\temp> $Identities | get-member


   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
ALIAS       NoteProperty string ALIAS=ProjectMailbox1

注意有一个别名 属性,其中包含值 ALIAS=ProjectMailbox1

这意味着当您遍历所有身份时,您正在遍历 ALIAS=ProjectMailbox1、ALIAS=ProjectMailbox2、ALIAS=ProjectMailbox3,而不是您实际期望的数据。

要获得您期望的结果,您需要引用您所追求的 属性,在您的特定情况下(根据错误消息判断)看起来您需要引用 Identity 属性:

set-clutter -identity $Identity.Identity -enable $false

Import-CSV 尝试创建一个 object,它期望 CSV 文件中的多个列构建出 object 的所有属性。例如,您可能有 FirstNameLastNameAliasSamAccountName 列,您就可以调用这些属性中的任何一个。

如果您只处理一个 'column' 数据,最好只使用每行一个项目的文本文件(顶部没有标题)。然后,您可以使用 Get-Content 导入文本文件并对其进行迭代,您将按照预期处理简单的字符串,而不是单个 属性 psobjects.

If you're only dealing with one 'column' of data, your better off just using a text file with one item per line (and no heading at the top). Then you can import the text file with Get-Content and iterate over it and you'll be dealing with simple strings as you'd expect rather than single property psobjects.

我只是想指出这一点要牢记在心。我刚刚花了一个小时试图弄清楚为什么我不再从我的对象中获得 PrimarySMTPAddress。都是因为我决定使用 Import-CSV 而不是 Get-Content