#Требуем запуск от администратора
#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