PowerShell检查Azure存储容器是否存在

6

我正在创建一个PowerShell脚本来执行几个步骤,其中之一涉及删除Azure存储容器:

Remove-AzureStorageContainer ....

下一步取决于此删除是否完成。
我如何知道以前的删除已成功执行,以便继续执行下一步?
类似以下内容:

如何让我知道先前的“删除”操作已成功执行,以便继续执行下一步?

while(Test-AzureStorageContainerExist "mycontainer")
{
    Start-Sleep -s 100
}
<step2>

很抱歉,“Test-AzureStorageContainerExist”似乎不可用。 :)

1
一种方法是尝试重新创建容器。在它仍在被删除的过程中,您将会收到一个“409冲突”响应。 - Sam Holder
谢谢@SamHolder,但最终的方法有点更复杂,因为它涉及到HdInsight和集群创建本身。总之,我不能自己创建容器,但你的方法在其他场景中是一个好方法。 - ferpega
4个回答

8

您可以请求存储容器列表并查找特定的容器,然后等待直到它不再返回。如果账户中没有太多的容器,这种方法还可以接受。但是如果有很多容器,这种方法将不会很有效。

while (Get-AzureStorageContainer | Where-Object { $_.Name -eq "mycontainer" })
{
    Start-Sleep -s 100
    "Still there..."
}

Get-AzureStorageContainer 命令还需要一个 -Name 参数,你可以循环询问并获取它;但是当容器不存在时,它会抛出一个错误(资源未找到),而不是提供空的结果,所以你需要捕获该错误并知道它已经被删除了(确保明确查找 Resource Not found 而非超时或类似情况)。
更新:另一种选择是直接调用 REST API 获取容器属性,直到收到 404(未找到)为止。这意味着容器已经不存在了。 http://msdn.microsoft.com/en-us/library/dd179370.aspx

0

这个有效

$containerDeleted = $false
while(!$containerDeleted) {
    Try {  
        Write-Host "Try::New-AzureStorageContainer"
        New-AzureStorageContainer -Name $storageContainerName -Permission Off -Context $context -Verbose -ErrorAction Stop
        $containerDeleted = $true
    } catch [Microsoft.WindowsAzure.Storage.StorageException] {
        Start-Sleep -s 5
    }
}

如果您查看返回的错误消息,异常代码是容器被删除


0

一个try/catch的方法:

try {
    while($true){
        Get-AzureStorageContainer -Name "myContainer -ErrorAction stop
        sleep -s 100
    }
} 
catch { 
     write-host "no such container" 
     # step 2 action
}

0
如果您来到这里是因为标题而不是 OP 的问题(它是谷歌的第一个结果),请尝试以下方法:
# crate a context of the storage account.
# this binds the following commands to a certain storage account.
$context = New-AzStorageContext -StorageAccountName $AccountName

# check whether the container exists.
Get-AzStorageContainer -Context $context -Name $containerName

# check the return value of the last call.
if ($? -eq $false) {
    # do what you need to do when it does not exist.
} else {
    # do what you need to do when it does exist.
}

对我来说,捕获异常并没有起作用,但是这个方法却有效。

1
这是谷歌的第一个搜索结果,仅在原问题发布9年后出现。 :-) - ferpega
1
@ferpega,即使是9年后阅读答案仍然很有帮助! - Alexander Oh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接