I am looking to pass a bunch of variables to the parameters of a function but since the script needs to be run unattended I will need to pass these variables within the script. i.e via invoke-expression or otherwise.
Below is the functions I am using:
Function Get-AzStorageContainerSASUri {
[CmdletBinding()]
Param(
[Parameter(Mandatory)]
$TenantId,
[Parameter(Mandatory)]
[String]$SubscriptionId,
[Parameter(Mandatory)]
[String]$ResourceGroupName,
[Parameter(Mandatory)]
[String]$StorageAccountName,
[Parameter(Mandatory)]
[String]$ContainerName,
[Parameter(Mandatory=$false)]
[Int]$TokenDurationMinutes = 15,
[Parameter(Mandatory)]
[System.Management.Automation.PSCredential]$Credential
)
# Connect as Service Principal
Connect-AzAccount -TenantId $TenantId -Credential $Credential -ServicePrincipal -WarningAction 'SilentlyContinue' | Out-Null
Select-AzSubscription -SubscriptionId $SubscriptionId | Out-Null
# Load the Storage Account context
$StorageAccountKey = (Get-AzStorageAccountKey -ResourceGroupName $ResourceGroupName -AccountName $StorageAccountName)[0].Value
$StorageContext = New-AzStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey
# Generate a full URI to the container with SAS token
$SasParam = @{
Context = $StorageContext
Name = $ContainerName
ExpiryTime = (Get-Date).AddMinutes($TokenDurationMinutes)
Permission = 'rw'
FullUri = $true
}
$DestinationUri = New-AzStorageContainerSASToken @SasParam
Return $DestinationUri
}
And here is the main script where I have put an invoke expression to assign the values to the parameters.
Foreach ($Source in $Sources) {
$Destination = Get-AzStorageContainerSASUri | Invoke-Expression '[string]$TenantId = "xxxxx-xxxxxx-xxxxx"', '[string]$SubscriptionId = "xxxxxxx-xxxxxx-xxxx"', '[string]$ResourceGroupName = "xxxxxx-xxxxx-xxxxx"', '[string]$StorageAccountName = "woukasrtest211202"', '[string]$Credential = Import-Clixml -Path "C:\AzCopy\xxxxxx-xxxxxxx-xxxxxx.credential"'
Sync-SftpToAzStorage -Source $Source -Destination $Destination ...
}
This should theoretically use both functions I've written without me needing to input for the parameters in the first function. However, I either get the error: "Expressions are only allowed as the first element of a pipeline." OR the invoke-expression doesn't seem to run at all and I get:"cmdlet Get-AzStorageContainerSASUri at command pipeline position 1 Supply values for the following parameters: TenantId:"
I believe its invoke-expression or invoke-command but I can't seem to get it working the way that is perhaps intended to achieve my desired outcome.
Thanks, Evan
In the end this was solved by listing them out after the function call to pass the variable to the functions parameters:
}