使用PowerShell脚本将表部署到Azure表存储中时出错

时间:2017-11-21 07:16:51

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

我正在运行下面的脚本并使用VSTS powershell任务中的参数部分通过powershell脚本传递$ fileObj的脚本参数。我正在尝试将表数据部署到Azure表存储中。我在.csv文件中有表数据,我正在尝试使用powershell脚本部署这些表实体并部署到azure表存储中。下面的脚本没有部署表实体并且失败并出现错误。任何人都可以帮助我。 我已将错误日志附加到onedrive位置:https://onedrive.live.com/?authkey=%21AEh2aAOnbmuzq9U&cid=5599285D52BD31F3&id=5599285D52BD31F3%21900&parId=root&action=locate

foreach($fo in $fileObj){
 Write-Host $fo.filepath
 $csv = Import-CSV $fo.filepath
  $cArray=$fo.Cols.split(",")
  foreach($line in $csv)
    {
    Write-Host "$($line.partitionkey), $($line.rowKey)"
    $entity = New-Object -TypeName Microsoft.WindowsAzure.Storage.Table.DynamicTableEntity -ArgumentList $line.partitionkey, $line.rowKey 
        foreach($c in $cArray){
     Write-Host "$c,$($line.$c)"
 $entity.Properties.Add($c,$line.$c)
 }
 $result = $table.CloudTable.Execute([Microsoft.WindowsAzure.Storage.Table.TableOperation]::Insert($entity))
 }
}

$subscriptionName = ""
$resourceGroupName = ""
$storageAccountName = ""
$location = ""

# Get the storage key for the storage account
$StorageAccountKey = ""

# Get a storage context
$ctx = New-AzureStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey

1 个答案:

答案 0 :(得分:0)

根据您提到的日志,我发现您的csv列名称似乎与您的代码不对应。您的CSV文件格式包含2个名为Partitionkey和Rowkey的Colunms不正确。请尝试使用以下演示代码和csv文件格式。它在myside上正常工作。

$resourceGroup ="resourceGroup name"
$storageAccount = "storage account Name"
$tableName = "table name"
$storageAccountKey = "storage key"
$ctx = New-AzureStorageContext -StorageAccountName $storageAccount -
StorageAccountKey $storageAccountKey 

######### Add removing table and create table code #######
try
{
    Write-Host "Start to remove table $tableName, please wait a moment..."

    Remove-AzureStorageTable -Name $tableName -Context $ctx -Force # Remove the Azure table

    Start-Sleep -Seconds 60 # waiting for removing table, you could change it according to your table 

    Write-Host "$tableName table has been removed"
}
catch
{
   Write-Host "$tableName is not existing"
}
Write-Host "Start to create $tableName table"

New-AzureStorageTable -Name  $tableName -Context $ctx  # Create new azure storage table

##########Add removing table and create table code ############

$table = Get-AzureStorageTable -Name $tableName -Context $ctx 
$csvPath ='csv file path'
$cols = "Label_Usage,Label_Value,Usage_Location" #should be corrensponding to your csv column exclude Partitionkey and RowKey
$csv = Import-Csv -Path $csvPath
$number = 0
[Microsoft.WindowsAzure.Storage.Table.TableBatchOperation]$batchOperation = New-Object -TypeName Microsoft.WindowsAzure.Storage.Table.TableBatchOperation
foreach($line in $csv)
{ 
     $number++
     $entity = New-Object -TypeName Microsoft.WindowsAzure.Storage.Table.DynamicTableEntity -ArgumentList $line.partitionkey, $line.rowKey 
     $colArray = $cols.split(",")
     Write-Host "$($line.partitionkey), $($line.rowKey)" #output partitionkey and rowKey value
     foreach($colName in $colArray)
     {
         Write-Host "$colName,$($line.$colName)" #output column name and value
        $entity.Properties.Add($colName,$line.$colName)
     }
    if($number -le 100)
    {
        $batchOperation.InsertOrReplace($entity) # Changed code
    }
    else
    {   $number =0
        $result = $table.CloudTable.ExecuteBatch($batchOperation)
   [Microsoft.WindowsAzure.Storage.Table.TableBatchOperation]$batchOperation = New-Object -TypeName Microsoft.WindowsAzure.Storage.Table.TableBatchOperation
    }
}
if($batchOperation.Count -ne 0)
{
 $result = $table.CloudTable.ExecuteBatch($batchOperation)
}

注意:对于批处理操作,需要CSV文件中的记录相同的分区键值。

csv文件示例格式

enter image description here

测试结果:

enter image description here