Термин «AzCopy» не распознается как имя командлета, функции, файла сценария

#powershell #azure-devops #azure-table-storage #azure-cli

Вопрос:

Мне нужно скопировать таблицы из хранилища таблиц в другую учетную запись хранилища. При попытке выполнить AzCopy я получаю следующее исключение:

Термин «AzCopy» не распознается как имя командлета, функции, файла сценария или исполняемой программы. Проверьте правильность написания имени или, если был указан путь, убедитесь, что он правильный, и повторите попытку.

Я подключен к терминалу с портала, и у меня есть приглашение powershell:

введите описание изображения здесь

Проблема, похоже, в этой строке:

 AzCopy /Source:$SrcTableUrl `  /Dest:$DstBlobUrl/$TableName `  /SourceKey:$SrcAccessKey `  /Destkey:$DstAccessKey  

Как мы запускаем команду AzCopy в терминале на портале Azure?

Вот полный код сценария powershell, который я пытаюсь выполнить:

 # This simple PowerShell script will copy one or more Azure storage table from one location into another azure storage table # # Dependencies : # https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy # https://docs.microsoft.com/en-us/powershell/azure/overview?view=azps-1.6.0 # # Usage : # Copy-AzureStorageTable -SrcStorageName "" -SrcAccessKey "" -DstStorageName "" -DstAccessKey "" -IncludeTable All  # Copy-AzureStorageTable -SrcStorageName "" -SrcAccessKey "" -DstStorageName "" -DstAccessKey "" -IncludeTable Table1,Table2,Table3   function Copy-AzureStorageTable {  param  (  [parameter(Mandatory=$true)]  [String]  $SrcStorageName,   [parameter(Mandatory=$true)]  [String]  $SrcAccessKey,   [parameter(Mandatory=$true)]  [String]  $DstStorageName,   [parameter(Mandatory=$true)]  [String]  $DstAccessKey,   [parameter(Mandatory=$true)]  [String[]]  $IncludeTable  )   # Check if logged in  Azure-Login   # Source Account Storage Parameters  $SrcContext = New-AzureStorageContext -StorageAccountName $SrcStorageName -StorageAccountKey $SrcAccessKey  $SrcBaseUrl = "https://"   $SrcStorageName   ".table.core.windows.net/"   # Destination Account Storage Parameters  $DstContext = New-AzureStorageContext -StorageAccountName $DstStorageName -StorageAccountKey $DstAccessKey  $DstTempContainer = "temptable"  $DstBlobUrl = "https://"   $DstStorageName   ".blob.core.windows.net/$DstTempContainer"  $DstTableUrl = "https://"   $DstStorageName   ".table.core.windows.net"   # Create container in destination blob  Write-Host "$DstTempContainer is not existing in $DstStorageName..."  Write-Host "Creating container $DstTempContainer in $DstStorageName..."  New-AzureStorageContainer -Name $DstTempContainer -Permission Off -Context $DstContext   # Get all tables from source  $SrcTables = Get-AzureStorageTable -Name "*" -Context $SrcContext  foreach($table in $SrcTables)  {  $TableName = $table.Name   Write-Host "Table $TableName"   # Validate if copy all table from source  # Validate if table name is included in our list  if(!$IncludeTable.Contains("All") -and !$IncludeTable.Contains($TableName))  {  Write-Host "Skipping table $TableName"  return  }    Write-Host "Migrating Table $TableName"   $SrcTableUrl = $SrcBaseUrl   $TableName   # Copy Table from source to blob destination. As far as I know there is way no way to copy table to table directly.  # Alternatively, we will copy the table temporaryly into destination blob.  # Take note to put the actual path of AzCopy.exe  Write-Host "Start exporting table $TableName..."  Write-Host "From : $SrcTableUrl"  Write-Host "To : $DstBlobUrl/$TableName"   AzCopy /Source:$SrcTableUrl `  /Dest:$DstBlobUrl/$TableName `  /SourceKey:$SrcAccessKey `  /Destkey:$DstAccessKey    # Get the newly created blob  Write-Host "Get all blobs in $DstTempContainer..."  $CurrentBlob = Get-AzureStorageBlob -Container $DstTempContainer -Prefix $TableName -Context $DstContext   # Loop and check manifest, then import blob to table  foreach($blob in $CurrentBlob)  {  if(!$blob.Name.contains('.manifest'))  {  return  }   $manifest = $($blob.Name).split('/')[1]   Write-Host "Start importing $TableName..."  Write-Host "Source blob url : $DstBlobUrl/$TableName"  Write-Host "Dest table url : $DstTableUrl/$TableName"   Write-Host "Manifest name : $manifest"    # Import blob to table. Insert entity if missing and update entity if exists  AzCopy /Source:$DstBlobUrl/$TableName `  /Dest:$DstTableUrl/$TableName `  /SourceKey:$DstAccessKey `  /DestKey:$DstAccessKey `  /Manifest:$manifest `  /EntityOperation:"InsertOrReplace"   }  }   # Delete temp table storage after export and import process  Write-Host "Removing $DstTempContainer from destination blob storage..."  Remove-AzureStorageContainer -Name $DstTempContainer -Context $DstContext -Force }  # Login function Azure-Login {  $needLogin = $true   Try   {  $content = Get-AzureRmContext   if ($content)   {  $needLogin = ([string]::IsNullOrEmpty($content.Account))  }   }   Catch   {  if ($_ -like "*Login-AzureRmAccount to login*")   {  $needLogin = $true  }   else   {  throw  }  }   if ($needLogin)  {  Login-AzureRmAccount  } }  

Комментарии:

1. Если вы копируете данные, разве вам не нужна copy команда -gt; AzCopy copy ....

Ответ №1:

Облачная оболочка портала Azure показывает, что с 2021.11.10 используется версия AzCopy 10.6.1. Возможность копирования между таблицами была удалена после версии 7.3. введите описание изображения здесь

Вам нужно запустить скрипт с компьютера, с которого вы можете загрузить более старую версию AzCopy.