Я пытаюсь получить содержимое резервной копии файла пользователей 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
PowerShell/.Net сам по себе имеет очень четкие сообщения об ошибках, которые вы фактически уничтожаете бесполезным сообщением «Не удалось получить содержимое CSV $_». Другими словами: удалите Try/Catch и сосредоточьтесь на фактическом сообщении об ошибке. Если вы все еще не можете выяснить причину проблемы, отредактируйте свой вопрос и добавьте исходное сообщение об ошибке.
@iRon обязательно уловит настоящее сообщение об ошибке и отредактирует.
@iRon Добавил сообщение об ошибке и обновил код.
@RuiJarimba — добавлено сообщение об ошибке, а также обновлен код.
Это странная ошибка, поскольку она включает буквальное имя переменной. Пожалуйста, вставьте точную и полную информацию (включая позицию) в вопрос.
Можете ли вы подтвердить, что точный код в вашем сообщении действительно воспроизводит ошибку? Например, ваш вызов Get-AzStorageFileContent в настоящее время закомментирован, и вы ссылаетесь на переменную $backupFilename в $backupFilePath = $subdirectorypath + "/" + $backupFilename, которая не определена. Если вы не можете воспроизвести ошибку, вырезав и вставив код из своего сообщения, другим людям будет сложно отладить ее, поскольку нам придется догадываться, как на самом деле выглядит ваш код :-). Пожалуйста, также опубликуйте полное сообщение об ошибке и любые другие выходные данные сценария...
@mclayton Я добавил точный код, а также дал полное сообщение об ошибке.
Спасибо. В своем последнем редактировании вы на самом деле не вызываете Get-AzStorageFileContent, а просто Get-AzStorageFile, который «перечисляет каталоги и файлы для пути». согласно документации по адресу Learn.microsoft.com/en-us/powershell/module/az.storage/…, которая объясняет, почему файл не был загружен. Кроме того, ваш код по-прежнему не соответствует сообщению об ошибке — имена файлов другие. Есть ли какие-либо другие расхождения между опубликованным вами кодом и кодом, который вы запускаете локально?
@mclayton Сначала я помещаю файл в учетную запись хранения файлового ресурса amd, а затем использую Import-csv для загрузки содержимого файла. Должен ли я также использовать Get-AzStorageFileContent для вывода содержимого CSV-файла?
Вы определяете $filesharename как "userassignment", так откуда же переменная $csvpath берет C:\app? Вы уверены, что $csvpath = $filesharename + "/" + $subdirectorypath + "/" + $csvFileName указывает правильный путь к файлу?
@Theo Я сначала попробовал Get-AzStorageFileContent, и, поскольку он не сработал, попробовал import-CSV - я попытался указать полный путь, поскольку у меня есть общий файловый ресурс, каталог и само имя файла в качестве пути. Все равно это не работает. В Get-AzStorageFileContent я также передал параметры Sharename, Path (как указано выше) и Context. Я упускаю что-то еще здесь?
Нет, я имел в виду, что вы никогда не объединяете путь с корнем (C:\app), так что же вы видите $csvpath?
@Theo для $csvpath он показывает ниже вывод — csvpath: userassignment/wp_20240501/wp_20240501.csv. и появляется сообщение об ошибке: Import-Csv: не удалось найти часть пути «C:\app\userassignment\wvdpool-nonprod-pp-p_20240501\wvdpool-nonprod-pp-p_20240501.csv». В строке: 32 символов: 12 + $csvdata = Import-Csv -Path $csvpath -Delimiter "," + ~~~~~~~~~~~~~~~ + CategoryInfo : OpenError: (:) [Import-Csv ], DirectoryNotFoundException + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.ImportCsvCommand — почти уверен, что исходный путь неверен, но не могу этого понять. Нужна помощь.
Вам необходимо добавить КОРЕНЬ к имени файла, чтобы сделать его полностью квалифицированным. Поскольку вы этого не делаете, PowerShell определяет ваш путь, объединяя текущий путь с относительным путем, который вы ему указываете $csvpath. Вы говорите, что у вас есть общий ресурс, где должен находиться файл, поэтому объедините корневой путь для этого общего ресурса с остальной частью вашего пути. Например, если ваша общая папка находится по адресу \\AzServer\SomeFolder, вы можете объединить такие элементы, как $csvpath = [System.IO.Path]::Combine('\\AzServer\SomeFolder',$filesharename, $subdirectorypath, $csvFileName), чтобы получить полное имя файла.


Сначала я перечисляю файлы в учетной записи общего хранилища, а затем использую 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-файл.
Выход:
Я попробую это и дам вам знать.
Конечно, дайте знать, как только проверите.
Я запускаю этот сценарий непосредственно с портала Azure в runbook, поэтому в команде import-csv я получаю ту же ошибку «путь не найден», поэтому невозможно получить доступ к файлу csv с портала, независимо от того, какой путь я указываю. Но когда я запускаю то же самое в Windows PowerShell ISE при подключении к учетной записи автоматизации с помощью надстройки azureautomationtoolkit — все работает отлично, и я вижу результат на портале Azure. Почему не работает портал по пути? какой путь я должен указать для доступа к содержимому файла csv в хранилище файлов Azure?
@NaliniB Проверьте обновленный ответ, он прочитает CSV-файл из Azure Runbook.
Путь, по которому файл должен быть импортирован, — 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"
Вы можете создать временный путь и прочитать CSV-файл, зачем вам это нужно именно из «C:\app»?
Я даю c:\app, потому что хочу, чтобы этот сценарий запускался из самого Runbook Azure, поэтому хочу, чтобы этот файл загружался в само место хранения файлов.
Если я дам с C:\app», это отлично сработало при автоматической проверке учетной записи здесь i.imgur.com/r9xLhkM.png
Надеюсь, это решит вашу проблему.
Подскажите, какая конфигурация мне нужна? У меня есть доступ для авторов. Мне нужно еще что-нибудь?
Можете ли вы поделиться скриншотом ошибки и сценарием, которые могут быть мне полезны?
Я отредактировал скрипт в первом сообщении
Попробуйте выполнить мой точный код, который я дал, с правильным именем файла.
В моем первом скрипте просто измените $localDestination = "C:\app" и попробуйте подождать несколько минут для выполнения.
Есть сообщения об ошибках?