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

时间:2015-07-23 12:51:20

标签: powershell azure azure-storage azure-storage-blobs windows-server-2012

我有一个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脚本工作,但是当我在没有登录时在晚上运行命令时,这不会完成。 / p>

任何人都知道那可能是什么?

任务计划程序设置为使用

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

2 个答案:

答案 0 :(得分:0)

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

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

Set-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命令。

答案 1 :(得分:0)

我无法使powershell脚本工作。我假设如果我在环境变量中设置了凭据,我可以使它工作,正如它所说的那样,但我写了一个小程序来为我做这项工作。

如果您需要使用工具将内容备份到azure blob并删除旧的剩余备份,请访问https://github.com/sillyotter/BackupDBToAzure

感谢您的帮助!

相关问题