【问题标题】:Azure Powershell script fails when run through task scheduler通过任务计划程序运行时 Azure Powershell 脚本失败
【发布时间】:2015-07-23 12:51:19
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • Something like this: Set-AzureSubscription -SubscriptionName OP 不是已经在他的脚本中有这一行了吗?
    • 他做到了!我在发布后立即注意到并且现在正在使用 PowerShell。伙计,我假设您有多个 Azure 订阅?您的订阅名称有空格吗?
    • 很抱歉第一次读得太快了!我在 Set-AzureSubscription 命令之前使用 Select-AzureSubscription 命令更新了我的答案,这解决了我机器上的问题。
    • 我有一个订阅。我读到了选择订阅,但由于 Get-Subscription 只显示一个并说它是默认的,我认为不需要它。我将尝试 select-azuresubscription 以查看是否有帮助。当您说任务调度程序在不同的环境中运行时,您是什么意思。它肯定是以同一用户身份运行的。
    • 抱歉,Select-Sub 没有帮助。错误 Select-AzureSubscription :订阅名称 SubName 不存在。 Set-AzureSubscription :订阅名称 SubName 不存在。 Get-AzureStorageBlob :找不到您的 Azure 存储凭据。请使用“Set-AzureSubscription”设置当前存储帐户或设置“AZURE_STORAGE_CONNECTION_STRING”环境变量。
    【解决方案2】:

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

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

    感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 2017-06-20
      • 2019-10-31
      • 1970-01-01
      • 2013-08-18
      • 2020-08-07
      • 2015-07-22
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      相关资源
      最近更新 更多