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