Загрузка данных


[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

# Настройки
$sourceDir = "Downloads_Bank_Docs"
$oldDocsDir = "Old_Doc_Files"
$convertedDir = "Converted_Docx_Files"

# Создаем папки, если их нет
if (!(Test-Path $oldDocsDir)) { New-Item -ItemType Directory -Path $oldDocsDir | Out-Null }
if (!(Test-Path $convertedDir)) { New-Item -ItemType Directory -Path $convertedDir | Out-Null }

Write-Host "--- 1. Ищу старые .doc файлы ---" -ForegroundColor Cyan

# Ищем строго .doc (игнорируя .docx)
$docFiles = Get-ChildItem -Path $sourceDir -Recurse -File | Where-Object { $_.Extension -eq ".doc" }

if ($docFiles.Count -eq 0) {
    Write-Host "Старых .doc файлов не найдено! Можно расслабиться." -ForegroundColor Green
    exit
}

Write-Host "Найдено старых файлов: $($docFiles.Count). Перемещаю..." -ForegroundColor Yellow

foreach ($file in $docFiles) {
    Move-Item -Path $file.FullName -Destination $oldDocsDir -Force
}

Write-Host "`n--- 2. Запускаю скрытый Microsoft Word для конвертации ---" -ForegroundColor Cyan

try {
    # Создаем COM-объект Word (запускаем его в фоне)
    $word = New-Object -ComObject Word.Application
    $word.Visible = $false

    $movedDocs = Get-ChildItem -Path $oldDocsDir -Filter "*.doc"
    $count = 0

    foreach ($doc in $movedDocs) {
        $count++
        Write-Host "[$count/$($movedDocs.Count)] Конвертирую: $($doc.Name)" -ForegroundColor White
        
        $docPath = $doc.FullName
        # Формируем новое имя с расширением .docx
        $newPath = Join-Path (Resolve-Path $convertedDir).Path ($doc.BaseName + ".docx")

        # Открываем файл
        $document = $word.Documents.Open($docPath)
        
        # 16 = wdFormatXMLDocument (это код формата .docx)
        $document.SaveAs([ref]$newPath, [ref]16)
        $document.Close()
    }
    Write-Host "`n--- ГОТОВО! ---" -ForegroundColor Green
    Write-Host "Новые файлы .docx лежат в папке: $convertedDir" -ForegroundColor White
} catch {
    Write-Host "`n[!] Ошибка при конвертации: $($_.Exception.Message)" -ForegroundColor Red
} finally {
    # Обязательно закрываем Word, чтобы он не висел в памяти
    if ($word) {
        $word.Quit()
        [System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null
    }
}

Read-Host "Нажми Enter для завершения"