2017-10-19 285 views
1

我試圖讓使用這些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模塊。 –

回答

1

我發現該錯誤是由於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'有兩個不同版本的文件。這導致東西打破...再次感謝很多! –

1

這是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模塊目錄。這顯然是一個脆弱的選擇,但可能是最簡單的快速解決方案。

相關問題