为什么 Guid 除非由 NewGuid() 创建,否则无法识别?
Why would a Guid not be recognized unless created by NewGuid()?
我有一些代码为 Microsoft.Xrm.Data.PowerShell 调用 Set-CrmRecord
cmdlet。它返回一个 InvalidCastException
。问题是我找不到任何类型不正确的东西。这是代码:
Set-CrmRecord -conn $conn -EntityLogicalName $entityName -Id $id -Fields $entity -Upsert
id 必须是 guid。当我挂起脚本并键入 $id.GetType()
时,它 returns 它是一个 guid。字段必须是散列 table,GetType()
确认它是。与连接和实体名称相同。我还检查了哈希table,如下所示:
$id = [guid]::Parse($_.Queue)
$entity = @{
"queueid" = $id;
"name" = $_.Name
}
queueid 是一个 Guid,name 是一个字符串。所以,看起来一切都是正确的。那么,两个问题:
- 是否有东西被包装到 PSObject 中,或者当我认为它是时却没有被解析?
- 有什么方法可以计算出导致问题的实际值吗?
更新
如果我在调试会话期间暂停,我可以创建一个 GUID 和哈希table 并调用 cmdlet,它会成功。
更新 2
我确定问题出在 -Id 参数上。唯一有效的方法是使用 [guid]::NewGuid()
。如果我使用 [guid]::new('...')
或 [guid]::Parse('...')
,它不起作用并给我一个转换异常。转换也不适用于这些其他选项。 IE。 [guid]$id
当使用其他两种类型中的任何一种制作 id 时都不起作用。
另请注意,传递给散列的 guidtable 在所有情况下都有效。
这些调用有什么区别?
看起来 Set-CrmRecord
不希望您在 -Fields 哈希表中指定记录的 ID。
示例:
使用 upsert 创建一个新帐户
$id = [Guid]::NewGuid()
$entity = @{"name"="Foo Bar"}
$newid = Set-CrmRecord -conn $con -EntityLogicalName account -id $id -Fields $entity -Upsert
现在用 upsert 更新它
$entity = @{"name"="Foo Bar Baz"}
Set-CrmRecord -conn $con -EntityLogicalName account -id $newid -Fields $entity -Upsert
您可以将 -id 参数指定为 Guid 对象或只是 guid 的文本表示形式。
我有一些代码为 Microsoft.Xrm.Data.PowerShell 调用 Set-CrmRecord
cmdlet。它返回一个 InvalidCastException
。问题是我找不到任何类型不正确的东西。这是代码:
Set-CrmRecord -conn $conn -EntityLogicalName $entityName -Id $id -Fields $entity -Upsert
id 必须是 guid。当我挂起脚本并键入 $id.GetType()
时,它 returns 它是一个 guid。字段必须是散列 table,GetType()
确认它是。与连接和实体名称相同。我还检查了哈希table,如下所示:
$id = [guid]::Parse($_.Queue)
$entity = @{
"queueid" = $id;
"name" = $_.Name
}
queueid 是一个 Guid,name 是一个字符串。所以,看起来一切都是正确的。那么,两个问题:
- 是否有东西被包装到 PSObject 中,或者当我认为它是时却没有被解析?
- 有什么方法可以计算出导致问题的实际值吗?
更新
如果我在调试会话期间暂停,我可以创建一个 GUID 和哈希table 并调用 cmdlet,它会成功。
更新 2
我确定问题出在 -Id 参数上。唯一有效的方法是使用 [guid]::NewGuid()
。如果我使用 [guid]::new('...')
或 [guid]::Parse('...')
,它不起作用并给我一个转换异常。转换也不适用于这些其他选项。 IE。 [guid]$id
当使用其他两种类型中的任何一种制作 id 时都不起作用。
另请注意,传递给散列的 guidtable 在所有情况下都有效。
这些调用有什么区别?
看起来 Set-CrmRecord
不希望您在 -Fields 哈希表中指定记录的 ID。
示例:
使用 upsert 创建一个新帐户
$id = [Guid]::NewGuid()
$entity = @{"name"="Foo Bar"}
$newid = Set-CrmRecord -conn $con -EntityLogicalName account -id $id -Fields $entity -Upsert
现在用 upsert 更新它
$entity = @{"name"="Foo Bar Baz"}
Set-CrmRecord -conn $con -EntityLogicalName account -id $newid -Fields $entity -Upsert
您可以将 -id 参数指定为 Guid 对象或只是 guid 的文本表示形式。