Public/Update-SpecAzTableRowUsingSAS.ps1

function Update-SpecAzTableRowUsingSAS {
    <#
    .SYNOPSIS
    Updates a row in an Azure Table Storage using a Shared Access Signature (SAS) token.
 
    .DESCRIPTION
    This function allows you to update a row in an Azure Table Storage using a SAS token for authentication. It can also create a new row if it does not already exist.
 
    .PARAMETER TableName
    The name of the Azure Table to update the row in.
 
    .PARAMETER StorageAccount
    The name of the Azure Storage Account containing the table.
 
    .PARAMETER SASToken
    The Shared Access Signature (SAS) token for authenticating with the Azure Table Storage.
 
    .PARAMETER PartitionKey
    (Optional) The partition key for the row to update. Default is '1'.
 
    .PARAMETER Key
    The row key for the row to update.
 
    .PARAMETER PropertyList
    An array of properties to update. Each property should be in the format of a key-value pair.
 
    .PARAMETER Method
    (Optional) The update method to use. Default is 'Merge'.
 
    .EXAMPLE
    $PropertyListFilter = @{
        DeviceType = "HR"
        Last_Logged_On = "fred.bloggs"
    }
 
    Update-SpecAzTableRowUsingSAS -TableName $tablename -storageAccount $storageAccount -sastoken $sasWriteToken -key '123456' -PropertyList $PropertyListFilter
 
    Updates only the properties and values specified in the $propertyListFilterArray for the table row containing the rowkey of '123456'. If the table contains other table headers with existing values it leaves them untouched.
 
    .EXAMPLE
 
    $PropertyListFilter = @{
        Device_Name = $env:computername
        Last_Logged_On = 'fred.bloggs'
        DeviceType = 'HR'
        IP_Address_Wifi = '172.18.0.1'
        StoreName = 'MyStore'
        StoreNumber = '123456'
    }
 
    # Function params
    $tableRowParams = @{
        tableName = $tableName
        StorageAccount = $StorageAccount
        SasToken = $sasWriteToken
        key = '112233' # This is the unique value identifying the row to modify,under the RowKey header
        PropertyList = $PropertyListFilter # An array containing ONLY the properties\values to modify
    }
 
    write-host "Adding new row to table [$tablename]" -ForegroundColor DarkCyan
    try {
        Update-SpecAzTableRowUsingSAS @Params -ea stop
        write-host "Row updated" -ForegroundColor DarkGreen
    } catch {
        write-host "oops - an error occurred: $_" -ForegroundColor DarkYellow
    }
 
    Updates the row with rowkey 'U112233' and updates the properties listed in the $propertyListFilter to the corresponding values.
    If the rowkey does not exist, it will create a new row in the table.
 
 
    .NOTES
    Author: owen.heaume
    Version: 1.0 Initial release
                2.0 Update to use Write-Error for elegant handling within try \ catch blocks
 
    #>


    [cmdletbinding()]

    param
    (
        [Parameter(Mandatory = $true)]
        [string]$TableName,

        [Parameter(Mandatory = $true)]
        [string]$StorageAccount,

        [Parameter(Mandatory = $true)]
        [string]$SasToken,

        [parameter(Mandatory = $false)]
        [string]$PartitionKey = '1',

        [Parameter(Mandatory = $true)]
        [string]$Key,

        [Parameter(Mandatory = $true)]
        [array]$PropertyList,

        [Parameter(Mandatory = $false)]
        [string]$Method = 'Merge'
    )

    Write-Verbose "Updating $tableName"

    $version = '2017-04-17'
    $resource = "$tableName(PartitionKey='$partitionkey',RowKey='$key')"
    $table_url = "https://$storageAccount.table.core.windows.net/$resource$SasToken"
    $GMTTime = (Get-Date).ToUniversalTime().toString('R')
    $headers = @{
        'x-ms-date' = $GMTTime;
        Accept      = 'application/json;odata=nometadata'
    }

    $body = $PropertyList | ConvertTo-Json

    Try {
        $item = Invoke-RestMethod -Method $method -Uri $table_url -Headers $headers -ContentType application/json -Body $body -UseBasicParsing -ea stop
    } catch [System.Net.WebException] {
        if ($_.Exception.Message -contains 'The remote server returned an error: (404) Not Found.') {
            Write-Error "Table [$TableName] not found. Please check that the table exists and that you have not made a typo. $_"
        } elseif ($_.Exception.Message -match 'The remote name could not be resolved') {
            Write-Error "Storage account [$StorageAccount] not found. Please check that the storage account exists and that you have not made a typo. $_"
        } else {
            # Handle other WebExceptions
            Write-Error "A WebException occurred: $_.Exception.Message)"
        }
    } catch {
        Write-Error "An error occurred: $_"
    }
}