【问题标题】:Azure Automation (Powershell Runbook) - Cannot convert value to type System.StringAzure 自动化(Powershell Runbook) - 无法将值转换为 System.String 类型
【发布时间】:2020-11-20 14:53:04
【问题描述】:

我在 Azure 自动化中有一个 powershell Runbook,其中包含以下代码:

param
(        
        [Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] 
        [String] $ADMINUSERS,
)


#parse User data
function Get-GroupUser 
{
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        [string]$inputUsers
    )
        $userlist = $Local:inputUsers.split(',')
        if ($Local:inputUsers -notlike "*@*") {
            $userlist.replace(' ','')
        } 
        else {
            $returnArray = @()    
            foreach ($user in $($inputUsers | convertFrom-Json)) {
                $returnArray += $user.split('@')[0]
            }
            $returnArray
}

Get-GroupUser -inputUsers $ADMINUSERS

我对 $ADMINUSERS 的第一个输入如下所示:

["johndoe@abc.biz","janedoe@abc.biz"]

当 Runbook 运行时,它立即失败并出现以下错误:

Cannot process argument transformation on parameter 'ADMINUSERS'. Cannot convert value to type System.String. (Cannot convert value to type System.String. (Cannot convert value to type System.String.))

$ADMINUSERS 的第二个输入如下所示:

johndoe,janedoe

这样就成功完成了。

有什么想法可以在 Azure 自动化中修复我的 Runbook 上的第一个输入错误吗?

注意:当我从服务器本地运行两个输入时,它成功完成。

【问题讨论】:

  • 您将参数声明为字符串,函数将其拆分为逗号以获得​​一个数组。这意味着你需要发送一个 string 而现在你正在发送数组.. "johndoe@abc.biz","janedoe@abc.biz" --> "johndoe@abc.biz,janedoe@abc.biz"johndoe,janedoe --> "johndoe,janedoe"
  • 将此特定数组转换为字符串的最佳方法是什么?
  • 我刚刚在我的评论中向你展示了不是吗?这当然是硬编码的。如果您有一个字符串数组并希望从中创建一个逗号分隔的字符串,请使用 -join 运算符,例如 $string = "johndoe@abc.biz","janedoe@abc.biz" -join ','
  • 我应该提到的一件事是输入来自存储帐户队列,它看起来像这样: "AdminUser": " [\"johndoe@abc.biz\",\"janedoe @abc.biz"]"。在运行手册输入部分,它显示如下:ADMINUSERS ["johndoe@abc.biz","janedoe@abc.biz"]

标签: azure powershell azure-automation runbook


【解决方案1】:

参数需要一个字符串或一个数组,但不能同时使用这两种形式。如果你想接受一个字符串数组,参数语法是:

[String[]] $ADMINUSERS

注意String之后的额外括号对,表示一个数组。

给定数组,您可以使用join 转换为逗号分隔的字符串:

Get-GroupUser -inputUsers ($ADMINUSERS -join ",")

我不知道你是否可以接受你提到的两种输入形式,应该选择其中一种。

【讨论】:

  • 当我测试它时,它在本地运行良好,但是当我将代码添加到 Azure 自动化 Powershell Runbook 并运行时,它失败并显示相同的错误消息。
  • 啊,问题是 Runbook 输入与参数类型 String 不匹配。请参阅更新的答案,我建议改用 String[] 或传递第二个以逗号分隔的原始值而不使用数组括号。
  • 我在 param 块中设置了 string[] 但现在我得到了一个不同但类似的错误:Get-GroupUser : Cannot process argument transformation on parameter 'inputUsers'. Cannot convert value to type System.String. At line:42 char:27 + Get-GroupUser -inputUsers $ADMINUSERS + ~~~~~~~~~~~ + CategoryInfo : InvalidData: (:) [Get-GroupUser], ParameterBindingArgumentTransformationException + FullyQualifiedErrorId : ParameterArgumentTransformationError,Get-GroupUser
  • 这使得 ADMINUSERS 现在似乎以数组形式被接受,然后需要作为字符串传递给 Get-GroupUser,您可以在其中使用 join
  • 您可以在测试期间使用 Write-Output 和 Write-Verbose 记录事物,这有助于查看某些点的情况:docs.microsoft.com/en-us/azure/automation/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多