为什么 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 是一个字符串。所以,看起来一切都是正确的。那么,两个问题:

  1. 是否有东西被包装到 PSObject 中,或者当我认为它是时却没有被解析?
  2. 有什么方法可以计算出导致问题的实际值吗?

更新

如果我在调试会话期间暂停,我可以创建一个 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 的文本表示形式。