运行 通过任务计划程序时 Azure Powershell 脚本失败

Azure Powershell script fails when run through task scheduler

我编写了一个 powershell 脚本,用于将本地 sqlserver 备份到 azure blob。它基于我从 MSDN 获取的一个,但我添加了一项额外功能来删除任何超过 30 天的旧备份。当我 运行 作为用户时,它工作正常。当我将其添加到任务计划程序时,设置为 运行,并手动将其设置为 运行,它工作正常。 (所有输出都记录在一个日志文件中,所以我可以看到它的所有工作)。当我在晚上未登录时从任务计划程序 运行 时(任务计划程序设置为 运行 脚本作为我)它失败了。具体来说,它声称当我调用 Set-AzureSubscription 时不知道我的 azure 订阅名称。然后,尝试删除 blob 时失败:

Get-AzureStorageBlob : Can not find your azure storage credential. Please set current storage account using "Set-AzureSubscription" or set the "AZURE_STORAGE_CONNECTION_STRING" environment variable.

有问题的脚本:

import-module sqlps
import-module azure

$storageAccount = "storageaccount"
$subscriptionName = "SubName"
$blobContainer = "backup"
$backupUrlContainer = "https://$storageAccount.blob.core.windows.net/$blobContainer/"
$credentialName = "creds"

Set-AzureSubscription -CurrentStorageAccountName $storageAccount -SubscriptionName $subscriptionName

$path = "sqlserver:\sql\servername\SQLEXPRESS\databases"
$alldatabases = get-childitem -Force -path $path | Where-object {$_.name -eq "DB0" -or $_.name -eq "DB1"} 

foreach ($db in $alldatabases)
{
    Backup-SqlDatabase -BackupContainer $backupUrlContainer -SqlCredential $credentialName $db
} 

$oldblobs = Get-AzureStorageBlob -container backup | Where-object { $_.name.Contains("DB") -and (-((($_.LastModified) - $([DateTime]::Now)).TotalDays)) -gt $(New-TimeSpan -Days 30).TotalDays }
foreach($blob in $oldblobs)
{
    Write-Output $blob.Name
    Remove-AzureStorageBlob -Container "backup" -Blob $blob.Name
}

脚本的备份部分有效,只是 blob 删除部分无效。当我登录时,似乎正在对环境执行某些操作,允许 azure powershell 脚本工作,但是当我 运行 在晚上未登录时执行命令时,这并没有完成。

有人知道那可能是什么吗?

任务计划程序设置为 运行 命令带有

Powershell -Command "C:\Scripts\BackupDatabases.ps1" 2>&1 >> "C:\Logs\backup.log"

Azure PowerShell 环境只需要了解默认情况下要使用的 Azure 订阅。您可能为自己的环境执行了此操作,但任务调度程序在不同的环境中 运行。

您只需在脚本的开头添加一个额外的命令来设置 Azure 订阅。像这样:

设置 AzureSubscription -SubscriptionName

此命令的文档是 here。您也可以通过 SubscriptionID 等而不是 SubscriptionName 来设置。

此外,this article 介绍了如何将 Azure 订阅连接到 PowerShell 环境。

更新:我搞砸了,让它工作了。尝试在 Set-AzureSubscription 命令之前添加 "Select-AzureSubscription"。

Select-AzureSubscription $subscriptionName
Set-AzureSubscription -SubscriptionName $subscriptionName -CurrentStorageAccountName $storageAccount 

Select-AzureSubscription 的文档是 here。如果你不依赖正在设置的存储帐户,则可以删除 Set-AzureSubscription 命令。

我一直无法使 powershell 脚本工作。我假设如果我在环境变量中设置凭据,我就可以让它工作,就像它说的那样,但我反而写了一个小程序来为我完成这项工作。

如果您需要一个工具来将内容备份到 Azure Blob 并删除旧的剩余备份,请访问 https://github.com/sillyotter/BackupDBToAzure

感谢您的帮助!