Exchange online powershell脚本接收“无法将哈希表转换为以下类型的对象”错误

问题描述 投票:1回答:2

我正在尝试将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文件中列出的邮箱的每次迭代,我都会重复以下错误:

无法处理参数'Identity'上的参数转换。无法将值“@ {IDENTITY = ProjectMailbox1}”转换为“Microsoft.Exchange.Configuration.Tasks.MailboxIdParameter”。错误:“无法将哈希表转换为以下类型的对象:Microsoft.Exchange.Configuration.Tasks.MailboxIdParameter。受限语言模式或数据部分不支持Hashtable-to-Object转换。” + CategoryInfo:InvalidData:(:) [Set-Clutter],ParameterBindin ... mationException + FullyQualifiedErrorId:ParameterArgumentTransformationError,Set-Clutter + PSComputerName:outlook.office365.com

根据错误消息,我相信我认为数据类型与从CSV文件传递到变量的内容和命令行开关所期望的内容不匹配。我没有足够的知识继续进行或补救。

以下是CSV文件外观的示例:

ALIAS

ProjectMailbox1 ProjectMailbox2 ProjectMailbox3 ProjectMailbox4 等等...

powershell csv office365
2个回答
2
投票

它总是有助于理智检查变量中的数据。将其管道到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属性,其中包含值ALIAS=ProjectMailbox1

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

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

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

Import-CSV尝试创建对象,期望CSV文件中的多个列构建对象的所有属性。例如,您可能拥有FirstName,LastName,Alias,SamAccountName列,并且您可以调用其中任何一个属性。

如果您只处理一个“列”数据,那么最好只使用每行一个项目的文本文件(顶部没有标题)。然后你可以用Get-Content导入文本文件并迭代它,你将处理简单的字符串,而不是单个属性psobjects。


0
投票

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

我只是想指出这是要记住的事情。我只是花了一个小时试图弄清楚为什么我不再从我的物体中获取PrimarySMTPAddress。所有这些都是因为我决定在Import-CSV上使用Get-Content

© www.soinside.com 2019 - 2024. All rights reserved.