Я ежедневно загружаю файл с сайта SharePoint, и приведенный ниже код работает нормально. Единственное, что мне нужно понять, это как передать параметр имени файла, если имя файла несовместимо.
Например. Файл был загружен ежедневно кем-то вроде этого
Full-Report-2023-01-10-03.00.13AM.csv
Full-Report-2023-01-09-02.00.43AM.csv
Full-Report-2023-01-08-20.30.53AM.csv
Я должен загружать этот файл ежедневно, но не знаю, как это сделать, если время указано в имени файла.
Любая помощь или предложение будут очень признательны.
function DownloadFile($token, $siteId, $driveId, $filePath, $fileName)
{
$headers=@{}
$headers.Add("Content-Type", "text/plain")
$headers.Add("Authorization", "Bearer $token")
$response = Invoke-WebRequest -Uri "https://graph.microsoft.com/v1.0/sites/$siteId/drives/$driveId/items/root:/$($filename):/content" -Method GET -OutFile $filePath -Headers $headers
}
# Need to fix here
DownloadFile -token $token -siteId $siteId -driveId $driveId -filePath "E:\Log-Files\Latest-Report.csv" -fileName "Full-Report-2023-01-08-20.30.53AM.csv"
@SantiagoSquarzon Привет, не могли бы вы показать мне, как это сделать?
Me/drive/root/children конечная точка не поддерживает упорядочивание по свойству createdDateTime, поэтому вам нужно упорядочивать файлы по убыванию name, используйте $filter, чтобы возвращать только файлы, начинающиеся с Full-Report-, чтобы уменьшить количество возвращаемых файлов. Вы можете использовать $select для возврата только свойств id и name. Вы можете вернуть только один элемент (используя $top), который должен быть последним файлом.
$latestFiles = Invoke-WebRequest -Uri "https://graph.microsoft.com/v1.0/sites/$siteId/drives/$driveId/items/root/children?`$orderby=name desc&`$filter=startswith(name,'Full-Report-')&`$select=name,id&`$top=1" -Method GET -Headers $headers
Итак, если у вас есть следующие файлы
Full-Report-2023-01-10-03.00.13AM.csv
Full-Report-2023-01-09-02.00.43AM.csv
Full-Report-2023-01-08-20.30.53AM.csv
Запрос выше должен возвращать только Full-Report-2023-01-10-03.00.13AM.csv
Разберите ответ json $latestFiles, чтобы получить свойство name первого элемента.
Теперь вы можете вызвать DownloadFile и использовать name из ответа выше для -fileName
# parse the response json to get name property of the first item
$firstItem = $latestFiles[0] #parse response by yourself
DownloadFile -token $token -siteId $siteId -driveId $driveId -filePath "E:\Log-Files\Latest-Report.csv" -fileName $firstItem.Name
Привет, спасибо за это, но когда я запускаю запрос, похоже, что он возвращает несколько элементов, а не только один, как упоминалось. пожалуйста посоветуй.
@aasenomad Моя ошибка. Перед $select, $filter, $order и $top должен быть символ обратной кавычки, иначе powershell будет обрабатывать эти параметры как свойства. Я обновил ответ, указав правильный URI для Invoke-WebRequest.
Большое спасибо за это, но, случайно, можем ли мы отфильтровать, если он содержит сегодняшнюю дату в имени файла, чтобы он не загружался, если файл не обновлен. Я пытаюсь изменить startwith на нравится или содержит, но все равно не повезло.
@aasenomad, использующий contains вместо startswith, тоже не работает для меня. Похоже, contains не поддерживается для этой конечной точки.
Можете ли вы перечислить файлы в /root:/? Если это так, то вы просто сортируете их по дате и выбираете самую новую.