Шаблон скрипта

#Требуем запуск от администратора 
#Requires -RunAsAdministrator   
#Requires -Version 5.1
 
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop" # Рекомендуется: скрипт упадет при первой же серьезной ошибке
 
#region Data input
# Автоматическое определение кодировки для вывода в консоль (исправляет кракозябры)
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
 
# Путь к скрипту (универсальный способ)
$MyScriptRoot = $PSScriptRoot
if (-not $MyScriptRoot) { $MyScriptRoot = Split-Path $MyInvocation.MyCommand.Path #старый способ }
 
#Подгружаем функции
$HelperFile = Join-Path $MyScriptRoot "f_MyCheck.ps1"
if (Test-Path $HelperFile) { . $HelperFile } else {Write-host -foreground Red "$HelperFile не найден!";exit}
 
$MyCSVIn      = Join-Path $MyScriptRoot "MyData_In.csv"
$MyCSVOut     = Join-Path $MyScriptRoot "MyData_Out.csv"
$MyHTML       = Join-Path $MyScriptRoot "MyData.html"
$MyLog        = Join-Path $MyScriptRoot "Script.log"
 
$MyList       = [System.Collections.Generic.List[PSCustomObject]]::new()
 
# Пример встроенных данных с очисткой
$MyDataRaw = @'
1111111111111111111111
2222222222222222222222
3333333333333333333333
'@ -split "`r?`n" | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } | ForEach-Object { $_.Trim() }
 
#или .split("",[System.StringSplitOptions]::RemoveEmptyEntries)
 
$MyList.AddRange(@(
    [pscustomobject]@{Name="Анна"; Age=30},
    [pscustomobject]@{Name="Олег"; Age=25},
    [pscustomobject]@{Name="Ирина"; Age=55}
))
 
 
# Проверка наличия входного файла перед импортом
if (Test-Path $MyCSVIn) {
    $MyData = Import-CSV -Path $MyCSVIn -Encoding UTF8 -Delimiter ";" | 
        Where-Object { $_.PSObject.Properties.Value -ne '' } | # Удаление пустых строк
        Sort-Object -Property fio
} else {
    Write-Warning "Входной файл $MyCSVIn не найден. Используются данные по умолчанию."
    $MyData = $MyDataRaw
}
 
# Параметры для HTML (Splatting)
$HTMLSettings = @{
    Title      = "Отчет от $(Get-Date -Format 'dd.MM.yyyy')"
    Body       = "<h2>Результаты обработки</h2>"
    Head       = "<style>body{font-family:Arial; table{border-collapse:collapse;} td,th{border:1px solid #ccc; padding:5px;}}</style>"
    PreContent = "<p>Дата запуска: $(Get-Date)</p>"
}
 
#endregion 
 
#region Обработка данных
 
foreach ($Item in $MyData) {
    try {
        # В PS 5.1 для отладки лучше использовать Write-Debug или Write-Verbose
        Write-Verbose "Обработка: $Item"
 
        # Пример логики: если это объект из CSV или строка из массива
        $CurrentVal = if ($null -ne $Item.fio) { $Item.fio } else { $Item }
 
        if ($CurrentVal -like "2*") {
            $NewObject = [PSCustomObject]@{
                Timestamp = Get-Date -Format "HH:mm:ss"
                Data1     = $CurrentVal
                RandomID  = Get-Random
                User      = $env:USERNAME
            }
            $MyList.Add($NewObject)
        }
    }
    catch {
        Write-Error "Ошибка при обработке элемента $Item : $_"
    }
}
#endregion 
 
#region Вывод данных
 
if ($MyList.Count -gt 0) {
    # 1. Вывод в консоль (таблицей)
    $MyList | Format-Table -AutoSize
 
    # 2. Выбор пользователем через GridView
    # $Selection = $MyList | Out-GridView -Title "Выберите строки для сохранения" -PassThru
 
    # 3. Экспорт в CSV
    $MyList | Export-Csv -Path $MyCSVOut -NoTypeInformation -Encoding UTF8 -Delimiter ";"
 
    # 4. Экспорт в HTML (используем сплэттинг параметров)
    $MyList | ConvertTo-Html @HTMLSettings | Out-File $MyHTML -Encoding UTF8
 
    Write-Host "Готово. Данные сохранены в $MyCSVOut" -ForegroundColor Green
} else {
    Write-Warning "Нет данных для экспорта."
}
 
# Блок быстрого открытия результатов (раскомментировать нужное)
# Invoke-Item $MyCSVOut
# Invoke-Item $MyHTML
# notepad $MyLog
#endregion
 
#region Отправка почты (Splatting)
$MailParams = @{
    From        = 'admin@company.com'
    To          = 'manager@company.com'
    Subject     = "Отчет: $(Get-Date -ShortDateString)"
    Body        = "Скрипт завершил работу. Результаты во вложении."
    SmtpServer  = 'smtp.company.local'
    Port        = 25
    Attachments = @($MyCSVOut, $MyHTML)
    # UseSSL    = $true 
    # Credential = Get-Credential # Если нужна авторизация
}
 
# Send-MailMessage @MailParams -ErrorAction SilentlyContinue
#endregion