如何使用PowerShell在Azure存储表中获取一行?

时间:2017-10-19 18:24:47

标签: powershell azure azure-storage azure-table-storage

我正在尝试使用这些PoserShell命令获取Azure存储表中的所有行:

$saContext = (AzureRmStorageTable\Get-AzureRmStorageAccount -Name $storageAccount -ResourceGroupName $resourceGroup).Context
$table = Get-AzureStorageTable -Name $tableName -Context $saContext
Get-AzureStorageTableRowAll -table $table

但它会返回此错误:

Cannot find an overload for "ExecuteQuery" and the argument count: "1".
At C:\Program Files\WindowsPowerShell\Modules\AzureRmStorageTable\1.0.0.17\AzureRmStorageTableCoreHelper.psm1:305 char:6
+         $result = $table.CloudTable.ExecuteQuery($tableQuery)
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

我甚至使用了这些命令行,但所有命令都会返回相同的错误:

#Get-AzureStorageTableRowByColumnName -columnName "Average" -operator Equal -table $table -value 3228132966.4
#Get-AzureStorageTableTable -resourceGroup $resourceGroup -storageAccountName $storageAccount -tableName $tableName
#Get-AzureStorageTableRowAll -table $table | ft
#Get-AzureStorageTableRowByPartitionKey -table $table –partitionKey “I-Used-One-Of-My-Partition-Keys-From-Table” | ft

您知道如何使用PowerShell在Azure存储表中获取一行吗? 实际上,我已经从here安装了AzureRmStorageTable

3 个答案:

答案 0 :(得分:1)

我发现该错误是由于AzureRmStorageTable V1.0.0.17中的某些问题。 我已将其更新到V1.0.0.20,现在它正在运行。 在V1.0.0.20的文档中,他们写道: '实施了一些措施,以避免不同程序集版本之间发生冲突,更具体地说是Microsoft.WindowsAzure.Storage.Dll。'

我无法记住默认情况下在Runbook上安装了哪个版本,无论如何,如果您更新它将会有效。

由于

答案 1 :(得分:1)

这是在PowerShell模块Azure.Storage和AzureRm.Storage中区分dll版本的结果。 AzureRm.Storage的旧版本的Microsoft.WindowsAzure.Storage.dll比Azure.Storage中的版本低,并且缺少功能。一旦两个程序集都被加载,那么告诉powershell使用哪个程序集并不是一个好方法。

在此处查看问题: https://github.com/Azure/azure-powershell/issues/5030

我可以想到三个解决方法:

1)如链接中所述,您可以使用New-Object创建指定程序集版本的powershell对象。 E.g:

$ctx = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $key
$sasToken = New-AzureStorageTableSASToken -Context $ctx -Permission a -Name $StorageTableName
$sasURI = $ctx.TableEndpoint + $StorageTableName + $sasToken
$cloudTable = New-Object -typename "Microsoft.WindowsAzure.Storage.Table.CloudTable, Microsoft.WindowsAzure.Storage, Version=8.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" -ArgumentList $sasURI

2)在powershell中创建一个编译类来处理直接的.net交互。  命令Add-Type创建您的类,您可以在-ReferencedAssemblies参数中引用正确的dll。这里有一个简单的powerhell c#示例:http://activedirectoryfaq.com/2016/01/use-net-code-c-and-dlls-in-powershell/。这个选项最适合我。

3)将较新版本的Microsoft.WindowsAzure.Storage.dll从Azure.Storage模块目录复制到AzureRm.Storage模块目录。这显然是一个脆弱的选择,但可能是最简单的快速修复。

答案 2 :(得分:0)

这是使用新的Az命令获取所有行的答案,需要 AzTable 模块。

$storageAccountName = "name" 
$storageAccountKey = "key==" 
$context = New-AzStorageContext $storageAccountName -StorageAccountKey $storageAccountKey
$cloudTable = (Get-AzStorageTable –Name "table_name" –Context $context).CloudTable
Get-AzTableRow -Table $cloudTable

使用过滤器检索行

[string]$filter = "Timestamp lt datetime'2019-05-27T13:58:04.0587693+02:00'"
Get-AzTableRow -Table $cloudTable -CustomFilter $filter

来自Azure https://docs.microsoft.com/bs-latn-ba/azure/storage/tables/table-storage-how-to-use-powershell的更多内容