如何在Powershell中复制Azure资源管理器模板uniquestring()函数?

如何在Powershell中复制Azure资源管理器模板uniquestring()函数?,powershell,azure,templates,Powershell,Azure,Templates,我有一个Azure托管服务,它使用ARM模板自动部署(在我们的构建过程中),在不同的资源组中有多个服务实例。一些资源需要全局唯一的名称,为了支持这一点,我使用uniquestring函数(通常针对资源组ID)生成部分资源名称。名称遵循模板模式,例如实例名称+组件名称+唯一字符串=“Example.WebAPI.abcd1234efgh5” 稍后,当使用Powershell脚本对这些资源执行维护时,会出现我的问题—我需要资源名称,这意味着使用相同的模板从实例、组件和资源组ID生成名称。但是,对于相

我有一个Azure托管服务,它使用ARM模板自动部署(在我们的构建过程中),在不同的资源组中有多个服务实例。一些资源需要全局唯一的名称,为了支持这一点,我使用
uniquestring
函数(通常针对资源组ID)生成部分资源名称。名称遵循模板模式,例如实例名称+组件名称+唯一字符串=“Example.WebAPI.abcd1234efgh5”

稍后,当使用Powershell脚本对这些资源执行维护时,会出现我的问题—我需要资源名称,这意味着使用相同的模板从实例、组件和资源组ID生成名称。但是,对于相同的输入,Powershell中没有函数返回与ARM
uniquestring
函数相同的值

据我所知,
uniquestring
只是简单地生成输入字符串的散列,并将其作为13个字符的表示返回;是否有人知道此哈希过程的细节,以便可以在Powershell中进行复制,或者是否已经进行了复制


我已经查看了的答案,但这需要在初始ARM模板中使用输出参数,并假设立即使用该值;然而,在我的用例中,我需要在初始部署后的几周或几个月使用资源名称。

该函数没有在任何地方记录,但它是确定的,这意味着如果您提供相同的输入,您总是会得到相同的输出,因此无需担心


如果你以后需要确定资源,你可以想出一系列解决办法,您始终可以使用
get AzureRmResourceGroupDeployment
获取部署的输出,或者您可以使用您可以动态推断的特定内容标记资源,或者您可以使用创建时间和其他间接因素过滤资源,您可以在此处查看:


我知道,
uniquestring
在ARM模板中是确定性的,我的问题是它不能从Powershell脚本中获得。对此你无能为力,就像我说的,只需使用相同的输入,不应该太硬使用相同的输入与什么?我不是从Powershell调用ARM模板,我使用的是AzureRM模块,它不包含类似的函数。我确实需要的资源名称是一个计算值,但该计算需要
uniquestring
函数,并且该函数在ARM模板之外不可用。更新了答案,我以为您的要求正好相反
#!/usr/bin/env pwsh

function Get-UniqueString ([string]$id, $length=13)
{
    $hashArray = (new-object System.Security.Cryptography.SHA512Managed).ComputeHash($id.ToCharArray())
        -join ($hashArray[1..$length] | ForEach-Object { [char]($_ % 26 + [byte][char]'a') })
}

Get-UniqueString "foobar"