首页 > 解决方案 > 如何使用 PowerShell 上传和删除 Azure Web 应用程序的文件

问题描述

我目前正在 Azure 上构建应用服务,并想编写一个 PowerShell 脚本来从本地上传/删除文件到应用服务。我曾经Invoke-WebRequest上传文件和Invoke-RestMethod删除文件,但Catch [Exception]收到一条 405 消息。我需要对 Azure 连接执行身份验证吗?我怎样才能快速实施它?

### init
$strHTTPS="https://xxx.azurewebsites.net/test/"   
$LocalFolder = "D:\AzureSolution\local_backup\"
$TargetFolder = $strHTTPS +  "azure_backup/" 

#Connect to Azure app servuce
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$WebConnect = Invoke-WebRequest -URI $strHTTPS 
$WebContent = $WebConnect.Links | Select href

Foreach ($Item in $WebContent ) {
   $FileName = split-Path $Item.href -Leaf  

   #download file in local folder ---------------------------------> test OK
   $SourcefileName = $strHTTPS + $FileName
   $LocalFileName = $LocalFolder+$FileName
   Try{
      Invoke-WebRequest -Uri $SourcefileName -OutFile $LocalFileName -PassThru 
   }
   Catch [Exception] {
      $ExceptionMsgPut = $_.Exception.GetType().FullName, $_.Exception.Message
   }

   #Backup file in Azure app servuce -------------------------------> test Failed
   $TargetFileName = $TargetFolder + $FileName
   $UploadWeb = New-Object System.Net.WebClient
   Try{
      $UploadWeb.UploadFile($TargetFileName,"PUT",$LocalFileName)
   }
   Catch [Exception] {
      $ExceptionMsgUpload = $_.Exception.GetType().FullName, $_.Exception.Message
   }         

   #Delete Azure Soruce File when completed ------------------------> test Failed
   Try{
      Invoke-RestMethod -Uri $SourcefileName -Method Delete 
   }
   Catch [Exception] {
      $ExceptionMsgDelete = $_.Exception.GetType().FullName, $_.Exception.Message
   }

   #Delete Local file when completed -------------------------------> test OK
   Try{
      Remove-Item $LocalFileName -recurse
   }
   Catch [Exception] {
      $ExceptionMsgDeleteLocalfile = $_.Exception.GetType().FullName, $_.Exception.Message
   }

}

[2021-11-05] 请求完成,使用@DeepDave-MT 的KUDU VFS API

function Get-AzureRmWebAppPublishingCredentials($resourceGroupName, $webAppName){
    $resourceType = "Microsoft.Web/sites/config"
    $resourceName = "$webAppName/publishingcredentials"
    $publishingCredentials = Invoke-AzureRmResourceAction -ResourceGroupName $resourceGroupName -ResourceType $resourceType -ResourceName $resourceName -Action list -ApiVersion 2015-08-01 -Force
    return $publishingCredentials
}

function Get-KuduApiAuthorisationHeaderValue($resourceGroupName, $webAppName){
    $publishingCredentials = Get-AzureRmWebAppPublishingCredentials($resourceGroupName, $webAppName)
    return ("Basic {0}" -f [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $publishingCredentials.Properties.PublishingUserName, $publishingCredentials.Properties.PublishingPassword))))
}

function Upload-FileToWebApp($resourceGroupName, $webAppName, $localPath, $kuduPath){
    $kuduApiAuthorisationToken = Get-KuduApiAuthorisationHeaderValue($resourceGroupName, $webAppName)
    $kuduApiUrl = "https://$webAppName.scm.azurewebsites.net/api/vfs/site/wwwroot/$kuduPath"
    $virtualPath = $kuduApiUrl.Replace(".scm.azurewebsites.", ".azurewebsites.").Replace("/api/vfs/site/wwwroot", "")
    Write-Host " Uploading File to WebApp. Source: '$localPath'. Target: '$virtualPath'..."  -ForegroundColor DarkGray

    Invoke-RestMethod -Uri $kuduApiUrl `
                        -Headers @{"Authorization"=$kuduApiAuthorisationToken;"If-Match"="*"} `
                        -Method PUT `
                        -InFile $localPath `
                        -ContentType "multipart/form-data"
}

function Delete-FileToWebApp($resourceGroupName, $webAppName, $kuduPath){
    $kuduApiAuthorisationToken = Get-KuduApiAuthorisationHeaderValue($resourceGroupName, $webAppNamee)
    $kuduApiUrl = "https://$webAppName.scm.azurewebsites.net/api/vfs/site/wwwroot/$kuduPath"
    $virtualPath = $kuduApiUrl.Replace(".scm.azurewebsites.", ".azurewebsites.").Replace("/api/vfs/site/wwwroot", "")
    Write-Host " Uploading File to WebApp. Source: '$localPath'. Target: '$virtualPath'..."  -ForegroundColor DarkGray

    Invoke-RestMethod -Uri $kuduApiUrl `
                    -Headers @{"Authorization"=$kuduApiAuthorisationToken;"If-Match"="*"} `
                    -Method DELETE
}

function Download-FileToWebApp($resourceGroupName, $webAppName, $kuduPath){
    $kuduApiAuthorisationToken = Get-KuduApiAuthorisationHeaderValue($resourceGroupName, $webAppNamee)
    $kuduApiUrl = "https://$webAppName.scm.azurewebsites.net/api/vfs/site/wwwroot/$kuduPath"
    $virtualPath = $kuduApiUrl.Replace(".scm.azurewebsites.", ".azurewebsites.").Replace("/api/vfs/site/wwwroot", "")
    Write-Host " Uploading File to WebApp. Source: '$localPath'. Target: '$virtualPath'..."  -ForegroundColor DarkGray

    Invoke-RestMethod -Uri $kuduApiUrl `
                    -Headers @{"Authorization"=$kuduApiAuthorisationToken;"If-Match"="*"} `
                    -Method GET `
                    -OutFile $localPath `
                    -ContentType "multipart/form-data"

标签: azurepowershellauthenticationinvoke-webrequest

解决方案


您可以使用KUDU VFS API

PUT /api/zip/{path} (Upload a zip file which gets expanded into the specified folder)

DELETE /api/vfs/{path} (Delete the file at path)

您可以参考如何使用 powershell 从 Azure WebApp 中删除文件?是否可以在Powershell中删除应用服务目录中的特定文件?使用 PowerShell和Kudu API 与 Azure Web Apps 虚拟文件系统交互


推荐阅读