Eldar
Eldar

Reputation: 25

Powershell variables in array

I'm creating a powershell script to add users to a system via API request.

I have defined a variable below, it has a lot of escape characters because it's a json string which goes into the body of the request and otherwise it wasn't possible to define user data as variables in it, but this way it works.

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

The command i execute to add a user is this one:

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

I would like to provide user related vars ($NAME, $LASTNAME etc) in a separate file. I did it for one user using dotsource - basically just defined abovementioned variables in a separate .ps1 file and referenced it in the script with . .\vars.ps1 and for one user it works just fine of course.

However if I need to construct a for loop for multiple users, I'm not sure what would be the best approach in this case.

Shall I define in my separate vars.ps1 file something like this:

$var=@($NAME='Jonny'; $LASTNAME='Doe'; $USERNAME='johnnydoe'; $EMAIL='[email protected]')

$var@($NAME='Jonny2'; $LASTNAME='Doe2'; $USERNAME='johnnydoe2'; $EMAIL='[email protected]')

and then use something like Get-Content "C:\Users\Desktop\vars.ps1" | ForEach-Object {do blahblah} in my script? But I'm not sure how it will be consumed by my $BODY_USERS variable. So I need to provide an array of variables to a variable, or something like that...

Being novice to powershell, i'm a little bit puzzled here.

Any advice is appreciated!

Upvotes: 0

Views: 1451

Answers (1)

zett42
zett42

Reputation: 27786

As noted in comments, you don't need to construct JSON string manually. Create a hashtable for much cleaner syntax and convert to JSON string using ConvertTo-JSON. This also takes care of escaping characters that have special meaning in JSON, like " and \.

$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

For multiple users you could store the data in a CSV file, which are quite easy to handle with PowerShell:

Users.csv

name,lastname,username,email
Jonny,Doe,johnnydoe,[email protected]
Jonny2,Doe2,johnnydoe2,[email protected]

Now we can process the users.csv like this:

$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
}

Upvotes: 5

Related Questions