[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
Set-Location $PSScriptRoot
$csvPath = "data.csv"
$downloadDir = "downloads"
$baseDomain = "https://main.atb.su"
if (!(Test-Path $downloadDir)) { New-Item -ItemType Directory -Path $downloadDir }
Write-Host "--- Читаю базу данных ---" -ForegroundColor Yellow
# Умное чтение CSV: пробуем точку с запятой. Если не вышло - пробуем запятую.
$data = Import-Csv -Path $csvPath -Delimiter ";" -Encoding UTF8
if ($data.Count -gt 0 -and -not $data[0]."Название") {
$data = Import-Csv -Path $csvPath -Delimiter "," -Encoding UTF8
}
foreach ($row in $data) {
$title = $row."Название"
if (-not $title) { continue }
$title = $title.Trim()
Write-Host "`nПоиск: $title" -ForegroundColor Cyan
# 1. СНАЧАЛА ПРОБУЕМ API ПОИСКА SHAREPOINT (самый надежный метод)
$escTitleSearch = $title -replace "'", "''" # Экранируем кавычки для запроса
$searchApiUrl = "$baseDomain/normdocs/_api/search/query?querytext='Title:`"$escTitleSearch`"'"
try {
$apiResponse = Invoke-WebRequest -Uri $searchApiUrl -UseDefaultCredentials -TimeoutSec 20
# Ищем ссылку на файл (pdf, doc, docx, xlsx и т.д.) в XML-ответе
if ($apiResponse.Content -match '(https://main\.atb\.su/[^<]+?\.(pdf|docx?|rtf|xlsx?))') {
$fileUrl = $matches[1]
$rawFileName = $fileUrl.Split('/')[-1]
$fileName = [System.Web.HttpUtility]::UrlDecode($rawFileName)
$savePath = Join-Path $downloadDir $fileName
Write-Host " [+] Найдено через API! Скачиваю: $fileName" -ForegroundColor Green
Invoke-WebRequest -Uri $fileUrl -OutFile $savePath -UseDefaultCredentials
continue # Переходим к следующему документу
}
} catch {
# Если API не ответил, просто молча идем к запасному методу
}
# 2. ЗАПАСНОЙ МЕТОД: ПОИСК ПО ФИЛЬТРУ КАТЕГОРИИ (как было раньше)
$escTitleUrl = [uri]::EscapeDataString($title)
$fallbackUrl = "$baseDomain/normdocs/Lists/Docs/ByCategory.aspx?FilterField1=Title&FilterValue1=$escTitleUrl"
try {
$page = Invoke-WebRequest -Uri $fallbackUrl -UseDefaultCredentials -TimeoutSec 20
if ($page.Content -match 'href="([^"]*?Attachments/[^"]+)"') {
$matchedUrl = $matches[1]
# --- ИСПРАВЛЕНИЕ ОШИБКИ ИМЕНИ ХОСТА ---
if ($matchedUrl -match "^http") {
$fileUrl = $matchedUrl # Ссылка уже полная
} else {
if (-not $matchedUrl.StartsWith("/")) { $matchedUrl = "/$matchedUrl" }
$fileUrl = "$baseDomain$matchedUrl" # Клеим домен аккуратно
}
$rawFileName = $fileUrl.Split('/')[-1]
$fileName = [System.Web.HttpUtility]::UrlDecode($rawFileName)
$savePath = Join-Path $downloadDir $fileName
Write-Host " [+] Найдено в списке! Скачиваю: $fileName" -ForegroundColor Green
Invoke-WebRequest -Uri $fileUrl -OutFile $savePath -UseDefaultCredentials
} else {
Write-Host " [-] Документ не найден в системе (нет ссылки на файл)." -ForegroundColor Yellow
}
} catch {
Write-Host " [!] Ошибка связи с SharePoint: $($_.Exception.Message)" -ForegroundColor Red
}
}
Write-Host "`n--- Завершено! Проверьте папку downloads ---" -ForegroundColor White
Read-Host "Нажмите Enter для выхода"