Su plantilla de PowerShell preferida para funciones de Azure activadas por HTTP
La anatomía de un script de PowerShell
- Para personalizar el comportamiento del script: entrada
- Para hacer el trabajo - procesamiento
- Para contarte lo que pasó - salida
Get-Thing -Name 'thing1' -Value 'value1'PS> Get-Thing -Name 'thing1' -Value 'value1'
thingvalue
PS> Get-Thing -Name 'thing1' -Value 'value1'
[pscustomobject]@{
Name = 'thing1'
Value = 'value1'
}El estilo PowerShell "antes"
[CmdletBinding()]
param(
[Parameter(Mandatory)]
[string]$ServiceName
)
## Returns the service object output from Restart-Service
Restart-Service -Name $ServiceName[CmdletBinding()]
param(
[Parameter(Mandatory)]
[string]$ComputerName,
[Parameter(Mandatory)]
[string]$ServiceName
)
## Returns the service object output from Restart-Service
Invoke-Command -ComputerName $ComputerName -ScriptBlock { Restart-Service -Name $using:ServiceName }.restartmyservice.ps1 -ComputerName 'REMOTEPC' -ServiceName 'someservice'Sin servidor y local: un entorno totalmente diferente
- Se ejecutará en una pieza de hardware que usted controle.
- El script tendrá acceso a los recursos de la red interna.
- Se ejecutará bajo algún tipo de contexto, como un usuario de dominio, un usuario local, etc.
- Se ejecutará todo el tiempo que sea necesario para completar el trabajo.
Fuera los viejos parámetros
[CmdletBinding()]
param(
[Parameter(Mandatory)]
$Request,
[Parameter(Mandatory)]
$TriggerMetadata
)
? Ni siquiera es necesario que los parámetros sean obligatorios porque cuando se invoca el script, esos siempre serán los dos parámetros que se le pasan.
Invocar el script de funciones de Azure
Invoke-RestMethod -Uri 'https://myapp.azurewebsites.net/restartservice?code=.....'I want to see what the Request parameter holds when I call this function so I’ll add a Write-Host reference like I usually do in the script and deploy the app (with the script) to Azure.? Puede obtener la URL base de cualquier función de Azure con PowerShell ejecutando:
PS> $functionApp = Get-AzFunctionApp -ResourceGroupName $resourceGroupName -Name $functionAppName PS> $functionApp.HostName | ForEach-Object { "https://$_/$functionName }
[CmdletBinding()]
param(
[Parameter(Mandatory)]
$Request,
[Parameter(Mandatory)]
$TriggerMetadata
)
Write-Host $RequestObtengamos algunos resultados con enlaces HTTP
[CmdletBinding()]
param(
[Parameter(Mandatory)]
$Request,
[Parameter(Mandatory)]
$TriggerMetadata
)
Push-OutputBinding -Name Response -Value $Request
using namespace System.Net[CmdletBinding()]
param(
[Parameter(Mandatory)]
$Request,
[Parameter(Mandatory)]
$TriggerMetadata
)
$response = @{
Body = $Request
}
Push-OutputBinding -Name Response -Value ([HttpResponseContext]$response)
? No olvides la línea
using namespaceSystem.Net. Esto carga el ensamblado .NET que necesita el tipo HTTPResponseContext.
Agregar parámetros "PowerShellEsque"
Crear variables a partir de parámetros de consulta HTTP
[CmdletBinding()]
param(
[Parameter()]
$Name,
[Parameter()]
$Value
)
Write-Host "The Name parameter is $Name"
Write-Host "The Value parameter is $Value"$Request.Query.GetEnumerator() | ForEach-Object {
New-Variable -Name $_.Key -Value $_.Value
}using namespace System.Net
[CmdletBinding()]
param(
[Parameter(Mandatory)]
$Request,
[Parameter(Mandatory)]
$TriggerMetadata
)
$Request.Query.GetEnumerator() | ForEach-Object {
New-Variable -Name $_.Key -Value $_.Value
}
$response = @{
Body = "The name passed was [$Name] with value of [$Value]
}
Push-OutputBinding -Name Response -Value ([HttpResponseContext]$response)
using namespace System.Net
[CmdletBinding()]
param(
[Parameter(Mandatory)]
$Request,
[Parameter(Mandatory)]
$TriggerMetadata
)
$response = @{
Body = $null
}
## Define all parameters (mandatory or optional)
$allowedQueryParams = @('Name','Value')
## Define all of the parameters that must have a value
$requiredParams = @('Name')
## If any HTTP query params passed are not recognized, stop
[array]$notRecognizedParams = Compare-Object $allowedQueryParams @($request.Query.Keys) | Select-Object -ExpandProperty InputObject
if ($notRecognizedParams.Count -gt 0) {
throw "The parameter(s) [$($notRecognizedParams -join ',')] were not recognized!"
}
## Ensure all mandatory parameters were passed
[array]$missingMandatoryParams = $requiredParams | Where-Object { $_ -notin @($request.Query.Keys) }
if ($missingMandatoryParams.Count -gt 0) {
throw "Missing mandatory parameter(s) [$($missingMandatoryParams -join ',')]!"
}
## If all parametere were recognized and all mandatory parameters were used, now create variables from them
$Request.Query.GetEnumerator() | ForEach-Object {
New-Variable -Name $_.Key -Value $_.Value
}
$response = @{
Body = "The name passed was [$Name] with value of [$Value]"
}
Push-OutputBinding -Name Response -Value ([HttpResponseContext]$response)El toque final: creación de errores HTTP descriptivos
- Envuelve todo el código dentro de un bloque
try/catch. - Define un código de estado HTTP personalizado en la respuesta.
- Define el mensaje de excepción como el cuerpo de la respuesta.
- Devuelve la respuesta HTTP en el bloque
finallypara devolver la respuesta independientemente de que se haya producido o no una excepción.
using namespace System.Net
[CmdletBinding()]
param(
[Parameter(Mandatory)]
$Request,
[Parameter(Mandatory)]
$TriggerMetadata
)
$response = @{}
try {
## Define all parameters (mandatory or optional)
$allowedQueryParams = @('Name','Value')
## Define all of the parameters that must have a value
$requiredParams = @('Name')
## If any HTTP query params passed are not recognized, stop
[array]$notRecognizedParams = Compare-Object $allowedQueryParams @($request.Query.Keys) | Select-Object -ExpandProperty InputObject
if ($notRecognizedParams.Count -gt 0) {
throw "The parameter(s) [$($notRecognizedParams -join ',')] were not recognized!"
}
## Ensure all mandatory parameters were passed
[array]$missingMandatoryParams = $requiredParams | Where-Object { $_ -notin @($request.Query.Keys) }
if ($missingMandatoryParams.Count -gt 0) {
throw "Missing mandatory parameter(s) [$($missingMandatoryParams -join ',')]!"
}
## If all parametere were recognized and all mandatory parameters were used, now create variables from them
$Request.Query.GetEnumerator() | ForEach-Object {
New-Variable -Name $_.Key -Value $_.Value
}
$response.Body = "The name passed was [$Name] with value of [$Value]"
} catch {
$response.StatusCode = [HttpStatusCode]::InternalServerError
$response.Body = ($_.Exception | Out-String)
} finally {
Push-OutputBinding -Name Response -Value ([HttpResponseContext]$response)
}





