数组中的 Powershell 变量

Eld*_*dar 0 variables powershell

我正在创建一个 powershell 脚本,通过 API 请求将用户添加到系统中。

我在下面定义了一个变量,它有很多转义字符,因为它是一个进入请求正文的 json 字符串,否则不可能将用户数据定义为其中的变量,但这种方式有效。

$BODY_USERS = "{`"firstName`":`"${NAME}`", `"lastName`":`"${LASTNAME}`",`"email`":`"${EMAIL}`",`"enabled`":`"true`", `"username`":`"${USERNAME}`",`"credentials`":[{`"type`":`"password`",`"value`":`"Test12345789#`",`"temporary`":true}]}"

我执行添加用户的命令是这样的:

Invoke-RestMethod -Uri $URI_USERS -Method Post -Headers $HEADERS_USERS -Body $BODY_USERS

我想($NAME, $LASTNAME etc)在单独的文件中提供与用户相关的变量。我使用dotsource为一位用户做了这件事——基本上只是在一个单独的 .ps1 文件中定义了上述变量,并在脚本中引用它. .\vars.ps1,对于一位用户,它当然工作得很好。

但是,如果我需要为多个用户构建一个 for 循环,我不确定在这种情况下最好的方法是什么。

我应该在我的单独vars.ps1文件中定义这样的:

$var=@($NAME='Jonny'; $LASTNAME='Doe'; $USERNAME='johnnydoe'; $EMAIL='johnny.doe@email.com')

$var@($NAME='Jonny2'; $LASTNAME='Doe2'; $USERNAME='johnnydoe2'; $EMAIL='johnny.doe2@email.com')

然后Get-Content "C:\Users\Desktop\vars.ps1" | ForEach-Object {do blahblah}在我的脚本中使用类似的东西?但我不确定我的$BODY_USERS变量将如何消耗它。所以我需要为一个变量提供一个变量数组,或者类似的东西......

作为PowerShell的新手,我在这里有点困惑。

任何建议表示赞赏!

zet*_*t42 5

如评论中所述,您无需手动构建 JSON 字符串。创建一个hashtable更简洁的语法并使用ConvertTo-JSON. 这还负责转义在 JSON 中具有特殊含义的字符,例如"\

$BODY_USERS = @{
    firstName = $NAME
    lastName = $LASTNAME
    email = $EMAIL
    enabled = $true
    username = $USERNAME
    credentials = @(
        @{ type = "password"; value = "Test12345789#"; temporary = $true }
    )
}

$BODY_USERS_JSON = ConvertTo-JSON $BODY_USERS

Invoke-RestMethod -Uri $URI_USERS -Method Post -Headers $HEADERS_USERS -Body $BODY_USERS_JSON
Run Code Online (Sandbox Code Playgroud)

对于多个用户,您可以将数据存储在 CSV 文件中,使用 PowerShell 很容易处理:

用户.csv

$BODY_USERS = @{
    firstName = $NAME
    lastName = $LASTNAME
    email = $EMAIL
    enabled = $true
    username = $USERNAME
    credentials = @(
        @{ type = "password"; value = "Test12345789#"; temporary = $true }
    )
}

$BODY_USERS_JSON = ConvertTo-JSON $BODY_USERS

Invoke-RestMethod -Uri $URI_USERS -Method Post -Headers $HEADERS_USERS -Body $BODY_USERS_JSON
Run Code Online (Sandbox Code Playgroud)

现在我们可以像这样处理users.csv

$allUsers = Import-Csv users.csv

$allUsers  # List users only for debugging purposes

foreach( $user in $allUsers ) {
    $BODY_USERS = @{
        firstName = $user.NAME
        lastName = $user.LASTNAME
        email = $user.EMAIL
        enabled = $true
        username = $user.USERNAME
        credentials = @(
            @{ type = "password"; value = "Test12345789#"; temporary = $true }
        )
    }

    $BODY_USERS_JSON = ConvertTo-JSON $BODY_USERS

    Invoke-RestMethod -Uri $URI_USERS -Method Post -Headers $HEADERS_USERS -Body $BODY_USERS_JSON
}
Run Code Online (Sandbox Code Playgroud)