Az Powershell – невозможно прочитать содержимое файла CSV

Я пытаюсь получить содержимое резервной копии файла пользователей CSV, сравнить его с текущими настройками и хочу назначить (неназначенных пользователей). Я получаю доступ к этому CSV-файлу из хранилища файлов – хотя файл указан в списке, я не могу прочитать его содержимое с помощью Import-Csv. Смотрите код ниже и помогите. Со вчерашнего дня боролся с этим!

 # Connect to Azure with system-assigned managed identity (automation account)
Connect-AzAccount -Identity

# Set the subscription
Set-AzContext -SubscriptionId "xxxxxxxxxxxxxxxxxxxxxx"

# Define the session host details
$storageaccountname = "xxxxxxxx"
$StorageAccountKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
$filesharename = "userassignment"
$resourceGroupName = "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
$FileName = storageaccountname/csvfilename

# Set the context of the Storage Account
$ctx = New-AzStorageContext -StorageAccountName $storageaccountname -StorageAccountKey $StorageAccountKey

#Get the file from the File Share
    Get-AzStorageFileContent -ShareName $filesharename -Path $FileName -Context $ctx -Destination "C:\app"
    # Get the contents of backed up users CSV
    #$csvPath = "C:\app\w20240501.csv"
    $csvfile = Import-Csv -Path "C:\app\w20240501.csv"
    Write-Output "csvfile: $csvfile"
No errors showing but csvfile variable is empty- its not getting imported 

Есть сообщения об ошибках?

Rui Jarimba 03.05.2024 14:20

PowerShell/.Net сам по себе имеет очень четкие сообщения об ошибках, которые вы фактически уничтожаете бесполезным сообщением «Не удалось получить содержимое CSV $_». Другими словами: удалите Try/Catch и сосредоточьтесь на фактическом сообщении об ошибке. Если вы все еще не можете выяснить причину проблемы, отредактируйте свой вопрос и добавьте исходное сообщение об ошибке.

iRon 03.05.2024 14:48

@iRon обязательно уловит настоящее сообщение об ошибке и отредактирует.

Nalini B 03.05.2024 15:44

@iRon Добавил сообщение об ошибке и обновил код.

Nalini B 03.05.2024 16:15

@RuiJarimba — добавлено сообщение об ошибке, а также обновлен код.

Nalini B 03.05.2024 16:16

Это странная ошибка, поскольку она включает буквальное имя переменной. Пожалуйста, вставьте точную и полную информацию (включая позицию) в вопрос.

iRon 03.05.2024 17:50

Можете ли вы подтвердить, что точный код в вашем сообщении действительно воспроизводит ошибку? Например, ваш вызов Get-AzStorageFileContent в настоящее время закомментирован, и вы ссылаетесь на переменную $backupFilename в $backupFilePath = $subdirectorypath + "/" + $backupFilename, которая не определена. Если вы не можете воспроизвести ошибку, вырезав и вставив код из своего сообщения, другим людям будет сложно отладить ее, поскольку нам придется догадываться, как на самом деле выглядит ваш код :-). Пожалуйста, также опубликуйте полное сообщение об ошибке и любые другие выходные данные сценария...

mclayton 04.05.2024 00:45

@mclayton Я добавил точный код, а также дал полное сообщение об ошибке.

Nalini B 04.05.2024 07:47

Спасибо. В своем последнем редактировании вы на самом деле не вызываете Get-AzStorageFileContent, а просто Get-AzStorageFile, который «перечисляет каталоги и файлы для пути». согласно документации по адресу Learn.microsoft.com/en-us/powershell/module/az.storage/…, которая объясняет, почему файл не был загружен. Кроме того, ваш код по-прежнему не соответствует сообщению об ошибке — имена файлов другие. Есть ли какие-либо другие расхождения между опубликованным вами кодом и кодом, который вы запускаете локально?

mclayton 04.05.2024 09:32

@mclayton Сначала я помещаю файл в учетную запись хранения файлового ресурса amd, а затем использую Import-csv для загрузки содержимого файла. Должен ли я также использовать Get-AzStorageFileContent для вывода содержимого CSV-файла?

Nalini B 04.05.2024 12:40

Вы определяете $filesharename как "userassignment", так откуда же переменная $csvpath берет C:\app? Вы уверены, что $csvpath = $filesharename + "/" + $subdirectorypath + "/" + $csvFileName указывает правильный путь к файлу?

Theo 04.05.2024 17:07

@Theo Я сначала попробовал Get-AzStorageFileContent, и, поскольку он не сработал, попробовал import-CSV - я попытался указать полный путь, поскольку у меня есть общий файловый ресурс, каталог и само имя файла в качестве пути. Все равно это не работает. В Get-AzStorageFileContent я также передал параметры Sharename, Path (как указано выше) и Context. Я упускаю что-то еще здесь?

Nalini B 04.05.2024 18:39

Нет, я имел в виду, что вы никогда не объединяете путь с корнем (C:\app), так что же вы видите $csvpath?

Theo 04.05.2024 23:19

@Theo для $csvpath он показывает ниже вывод — csvpath: userassignment/wp_20240501/wp_20240501.csv. и появляется сообщение об ошибке: Import-Csv: не удалось найти часть пути «C:\app\userassignment\wvdpool-nonprod-pp-p_20240501\wvdpool‌-nonprod-pp-p_202405‌​01.csv». В строке: 32 символов: 12 + $csvdata = Import-Csv -Path $csvpath -Delimiter "," + ~~~~~~~~~~~~~~~ + CategoryInfo : OpenError: (:) [Import-Csv ], DirectoryNotFoundException + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.ImportCsvComma‌​nd — почти уверен, что исходный путь неверен, но не могу этого понять. Нужна помощь.

Nalini B 05.05.2024 04:53

Вам необходимо добавить КОРЕНЬ к имени файла, чтобы сделать его полностью квалифицированным. Поскольку вы этого не делаете, PowerShell определяет ваш путь, объединяя текущий путь с относительным путем, который вы ему указываете $csvpath. Вы говорите, что у вас есть общий ресурс, где должен находиться файл, поэтому объедините корневой путь для этого общего ресурса с остальной частью вашего пути. Например, если ваша общая папка находится по адресу \\AzServer\SomeFolder, вы можете объединить такие элементы, как $csvpath = [System.IO.Path]::Combine('\\AzServer\SomeFolder',$fileshare‌​name, $subdirectorypath, $csvFileName), чтобы получить полное имя файла.

Theo 05.05.2024 13:03
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
15
184
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала я перечисляю файлы в учетной записи общего хранилища, а затем использую Import-csv для загрузки содержимого файла.

Я согласен с комментарием Маклейтона: Get-AzstorageFile используется для «списка каталогов и файлов для пути»; вам нужно использовать Get-AzStorageFileContent. Эта команда загрузит файл на локальный компьютер и прочитает ваш CSV-файл.

Вы можете использовать приведенный ниже сценарий для вывода списка файлов из определенного каталога, а также для чтения файла CSV.

Скрипт:

Connect-AzAccount -Identity

# Set the subscription
Set-AzContext -SubscriptionId "xxxxxxxxxxxxxxxxxxxxxx"

# Define the session host details
$storageaccountname = "venkat123"
$StorageAccountKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
$filesharename = "share1"
$resourceGroupName = "xxxxxxxxxxxxxxxxxxxxxxxxxxx"

$ctx = New-AzStorageContext -StorageAccountName $storageaccountname -StorageAccountKey $StorageAccountKey
Write-Output "ctx: $ctx"

$subdirectoryname = "wp_20240501"  
$subdirectorypath = $subdirectoryname
$csvFileName = "titanic.csv"

# List files within the directory of the Azure File Share
$files = Get-AzStorageFile -ShareName $filesharename -Context $ctx -Path $subdirectorypath -ErrorAction SilentlyContinue | Get-AzStorageFile

# Output the list of files
if ($files) {
    Write-Output "List of files in '$subdirectorypath':"
    foreach ($file in $files) {
        Write-Output $file.Name
    }

    # Check if the CSV file exists
    $csvFile = $files | Where-Object { $_.Name -eq $csvFileName }

    if ($csvFile) {
        # Define the local directory where the CSV file will be downloaded
        $localDestination = "<You destination path>" #c:\users\app\

        # Download the CSV file to the local destination
        $csvFilePath = Join-Path -Path $localDestination -ChildPath $csvFileName
        Get-AzStorageFileContent -ShareName $filesharename -Context $ctx -Path "$subdirectorypath/$csvFileName" -Destination $csvFilePath -Force

        # Check if the file was downloaded successfully
        if (Test-Path $csvFilePath -PathType Leaf) {
            # Read the content of the downloaded CSV file using Import-Csv
            $csvData = Import-Csv -Path $csvFilePath

            # Output the CSV data
            Write-Output $csvData
        } else {
            Write-Output "Failed to download the CSV file to the local destination."
        }
    } else {
        Write-Output "CSV file '$csvFileName' not found in the specified directory."
    }
} else {
    Write-Output "No files found in the specified directory."
}

Выход:

ctx: Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext
List of files in 'wp_20240501':
03-04-2024 (1).html
04-04-2024.html
April-04-2024 (1).html
response_1712214210668.html
titanic.csv


PassengerId : 1
Survived    : 0
Pclass      : 3
Name        : Braund, Mr. Owen Harris
Sex         : male
Age         : 22
SibSp       : 1
Parch       : 0
Ticket      : A/5 21171
Fare        : 7.25
Cabin       : 
Embarked    : S

Ссылка:

Get-AzureStorageFileContent (Azure.Storage) | Microsoft Learn

Обновлять:

Вы можете использовать приведенный ниже код в Azure Runbook для чтения файла CSV.

Скрипт:

$subdirectoryname = "wp_20240501"  
$subdirectorypath = $subdirectoryname
$csvFileName = "titanic.csv"

# List files within the directory of the Azure File Share
$files = Get-AzStorageFile -ShareName $filesharename -Context $ctx -Path $subdirectorypath -ErrorAction SilentlyContinue | Get-AzStorageFile

# Output the list of files
if ($files) {
    Write-Output "List of files in '$subdirectorypath':"
    foreach ($file in $files) {
        Write-Output $file.Name
    }

    # Check if the CSV file exists
    $csvFile = $files | Where-Object { $_.Name -eq $csvFileName }

    if ($csvFile) {
        # Download the CSV file to a temporary location
        $tempFilePath = Join-Path $env:TEMP -ChildPath $csvFileName
        Get-AzStorageFileContent -ShareName $filesharename -Context $ctx -Path "$subdirectoryname/$csvFileName" -Destination $tempFilePath -Force

        # Read the content of the downloaded CSV file using Import-Csv
        $csvData = Import-Csv -Path $tempFilePath

        # Output the CSV data
        Write-Output $csvData

        # Clean up the temporary file
        #Remove-Item -Path $tempFilePath -Force
    } else {
        Write-Output "CSV file '$csvFileName' not found in the specified directory."
    }
} else {
    Write-Output "No files found in the specified directory."
}

Приведенный выше код определит временный путь в автоматизации Azure и прочитает ваш CSV-файл.

Выход:

Я попробую это и дам вам знать.

Nalini B 06.05.2024 16:24

Конечно, дайте знать, как только проверите.

Venkatesan 06.05.2024 18:42

Я запускаю этот сценарий непосредственно с портала Azure в runbook, поэтому в команде import-csv я получаю ту же ошибку «путь не найден», поэтому невозможно получить доступ к файлу csv с портала, независимо от того, какой путь я указываю. Но когда я запускаю то же самое в Windows PowerShell ISE при подключении к учетной записи автоматизации с помощью надстройки azureautomationtoolkit — все работает отлично, и я вижу результат на портале Azure. Почему не работает портал по пути? какой путь я должен указать для доступа к содержимому файла csv в хранилище файлов Azure?

Nalini B 07.05.2024 05:25

@NaliniB Проверьте обновленный ответ, он прочитает CSV-файл из Azure Runbook.

Venkatesan 07.05.2024 06:07

Путь, по которому файл должен быть импортирован, — c:\app, который является путем к облачной оболочке. В содержимом файла get-az в месте назначения я указываю этот путь и импортирую файл CSV в это место назначения, но он не импортируется — КОД: #Get файл из общей папки Get-AzStorageFileContent -ShareName $filesharename -Path $FileName -Context $ctx -Destination "C:\app" # Получить содержимое резервной копии пользователей CSV #$csvPath = "C:\app\w_20240501. csv" $csvfile = Import-Csv -Path "C:\app\p_20240501.csv" Write-Output "csvfile: $csvfile"

Nalini B 07.05.2024 11:13

Вы можете создать временный путь и прочитать CSV-файл, зачем вам это нужно именно из «C:\app»?

Venkatesan 07.05.2024 11:32

Я даю c:\app, потому что хочу, чтобы этот сценарий запускался из самого Runbook Azure, поэтому хочу, чтобы этот файл загружался в само место хранения файлов.

Nalini B 07.05.2024 12:17

Если я дам с C:\app», это отлично сработало при автоматической проверке учетной записи здесь i.imgur.com/r9xLhkM.png

Venkatesan 07.05.2024 12:45

Надеюсь, это решит вашу проблему.

Venkatesan 07.05.2024 12:49

Подскажите, какая конфигурация мне нужна? У меня есть доступ для авторов. Мне нужно еще что-нибудь?

Nalini B 07.05.2024 13:39

Можете ли вы поделиться скриншотом ошибки и сценарием, которые могут быть мне полезны?

Venkatesan 07.05.2024 13:41

Я отредактировал скрипт в первом сообщении

Nalini B 07.05.2024 13:52

Попробуйте выполнить мой точный код, который я дал, с правильным именем файла.

Venkatesan 07.05.2024 13:55

В моем первом скрипте просто измените $localDestination = "C:\app" и попробуйте подождать несколько минут для выполнения.

Venkatesan 07.05.2024 13:57

Другие вопросы по теме

Похожие вопросы

Бета-версия C# Graph позволяет получить все типы назначений с их правилами обнаружения для всех Win32LobApps за один вызов
Служба связи Azure — ошибка «Приложение пытается получить доступ к службе 1fd5118e-2576-4263-8130-9503064c837a». Тогда известное решение не работает
Распространение самостоятельного расширения Chrome через организацию, управляемую Azure
Можно ли использовать PhraseListGrammar с IntentRecouncer в Microsoft Speech SDK для Java?
Публикация артефакта в Azure Devops Pipeline: ошибка получения разрешения на доступ к пути
Сбой контейнера Grobid при использовании приложений-контейнеров Azure
Функции Azure добавляют пользовательскую переменную среды во время публикации
Добавьте виртуальные приложения и каталоги в мое веб-приложение Azure
Копия ADF активно добавляет дополнительный столбец, если он недоступен в исходном коде
Конвейер Azure DevOps выдает сообщение «##[ошибка]Файлы проекта, соответствующие указанному шаблону, не найдены». при публикации моего приложения?