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

问题描述:

我试图让使用这些PoserShell的Azure存储表中的所有行命令:如何使用PowerShell获取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

+0

我也面临同样的错误。该代码似乎适用于较旧的系统。我不知道是什么导致了这个问题。运行最新的Azure PowerShell并安装AzureRmStorageTable模块。 –

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

我不记得默认情况下在Runbook上安装了哪个版本,无论如何,它会在你更新它的时候工作。

由于

+0

谢谢!我查看了代码并找出了错误。似乎PowerShell在'CloudTable'(可能来自Azure资源管理器)和'AzureStorageTable'(可能来自经典Azure)之间混淆,因为我们遇到了错误。如果你输入'[appdomain] :: currentdomain.getassemblies()',你会注意到'Microsoft.WindowsAzure.Storage'有两个不同版本的文件。这导致东西打破...再次感谢很多! –

这是differering在模块的powershell和Azure.Storage AzureRm.Storage DLL版本的结果。 AzureRm.Storage具有比Azure.Storage中的版本更早的Microsoft.WindowsAzure.Storage.dll版本,并且缺少功能。一旦加载了这两个程序集,就没有一个很好的方式告诉PowerShell使用哪一个。

看到这里的问题: https://github.com/Azure/azure-powershell/issues/5030

我能想到的三种解决方法:在链接中提到

1),你可以使用新的对象来创建PowerShell的对象指定程序集版本。例如:

$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。这里有一个简单的例子,在PowerShell中的c#:http://activedirectoryfaq.com/2016/01/use-net-code-c-and-dlls-in-powershell/。这个选项最适合我。

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