Helcode | Хелкод | Скрипты и автоматизация
993 subscribers
52 photos
34 links
☎️ Контакты для связи: @helcodeadm
Download Telegram
Почему -ErrorAction SilentlyContinue — это зло?

-ErrorAction SilentlyContinue — это как заглушить Check Engine в машине и надеяться, что всё ок. 🚗💥

🚨 Проблемы:
- Ошибки пропадают, а скрипт продолжает работать с битыми данными.
- Невозможно отладить, потому что вы даже не знаете, что что-то сломалось.

Что делать вместо этого?
# Вариант 1: Ловить ошибки и логировать
try {
Get-Item "C:\NonExistentFile.txt" -ErrorAction Stop
} catch {
Write-Warning "Файл не найден: $_"
# Или отправить в Telegram/Slack
}

# Вариант 2: Проверять результат
$file = Get-Item "C:\NonExistentFile.txt" -ErrorAction SilentlyContinue
if (-not $file) {
Write-Warning "Файл не найден, но мы это обработали!"
}



Когда можно использовать SilentlyContinue?

Только если ошибка ожидаема и не критична (например, проверка, существует ли файл перед удалением).

👉 Вы тоже когда-то глушили ошибки, а потом час искали баг? Поделитесь в коментариях!

🌐 @automate_today | #powershell
👍3
Как автоматизировать IIS?

WebAdministration модуль — ваш друг

Хотите управлять сайтами, пулами приложений или настройками SSL без ручного кликания? PowerShell спешит на помощь!

Примеры:
# Получить список всех сайтов
Get-Website | Select Name, State

# Перезапустить пул приложений
Restart-WebAppPool -Name "MyAppPool"

# Создать новый сайт
New-Website -Name "TestSite" -Port 8080 -PhysicalPath "C:\sites\test"



Плюсы:
- Можно полностью автоматизировать развёртывание.
- Интеграция с Ansible/Terraform (через PowerShell-провижнры).

👉 Кто ещё ненавидит IIS Manager? Дайте знать!

🌐 @automate_today | #powershell
👍2
Invoke-WebRequest тормозит? Вот как ускорить в 5 раз

PowerShell и медленные запросы — вечная история

Если ваш Invoke-WebRequest или curl (да, в PowerShell есть алиас!) работает как улитка в сиропе, возможно, вы просто не знаете одну хитрость.

🛠 Ускоряем запросы:
# Медленный вариант (по умолчанию)  
$response = Invoke-WebRequest -Uri "https://api.example.com/data"

# Быстрый вариант (отключаем проверку SSL + используем BasicParsing)
$response = Invoke-WebRequest -Uri "https://api.example.com/data" -DisableKeepAlive -SkipCertificateCheck -UseBasicParsing



Почему это работает?
- -SkipCertificateCheck убирает верификацию SSL (осторожно, только для доверенных источников!).
- -UseBasicParsing отключает парсинг DOM, если он не нужен.
- -DisableKeepAlive предотвращает "липкие" соединения, которые иногда тормозят.

🧑‍💻 Тест:

Попробуйте оба варианта с Measure-Command { ... } и сравните время (вставить команды выше вместо точек). Вы будете крайне удивлены. Разница примерно в 12 раз.

А какие у вас есть способы ускорения HTTP-запросов в PowerShell?

Если ваш запрос всё ещё медленный, возможно, проблема не в PowerShell, а в том, что API держит вас на кулдауне.


🌐 @automate_today | #powershell
👍3
Pester: как писать тесты для скриптов?

Если вы пишете PowerShell-скрипты без тестов — это как ехать на машине без тормозов. Раньше или позже будет больно.

Простейший тест с Pester:
# Файл MyScript.Tests.ps1  
Describe "Проверка функции сложения" {
It "2 + 2 должно быть 4" {
(2 + 2) | Should -Be 4
}

It "Скрипт должен содержать функцию Get-Data" {
Get-Command Get-Data -ErrorAction SilentlyContinue | Should -Not -BeNullOrEmpty
}
}



Как запустить?
Invoke-Pester -Path .\MyScript.Tests.ps1  



Зачем это нужно?
- Ловите баги до того, как скрипт уйдёт в продакшн.
- Рефакторинг становится безопаснее.
- Можно интегрировать в CI/CD (GitHub Actions, Azure DevOps).

А вы тестируете свои скрипты? Если да — какими инструментами?

Если тесты зелёные — можно мержить. Если красные — значит, вы хотя бы проверили.


🌐 @automate_today | #powershell
👍3
Как найти все битые ссылки в системе?

"Мёртвые" симлинки — тихие убийцы свободного места

Битые символьные ссылки (symlinks) не только бесполезны, но и могут сломать скрипты. Найдём и удалим их!

🛠 Bash-команда для поиска:
find /path/to/search -type l ! -exec test -e {} \; -print  



🛠 PowerShell-вариант:
Get-ChildItem -Path C:\ -Recurse -Force -ErrorAction SilentlyContinue |  
Where-Object { $_.Attributes -match "ReparsePoint" -and !(Test-Path $_.FullName) }



🛠 Что дальше?
- Удалить: find ... -delete (осторожно!).
- Заменить на актуальные пути.

А вы часто сталкиваетесь с битыми ссылками?

P.S. Если find ничего не нашёл — либо у вас идеальная система, либо вы искали не там.


🌐 @automate_today | #bash #powershell
👍2
Как автоматизировать переключение VPN при утечке DNS

VPN включён, но DNS сливается? Пора это исправить!

Даже если трафик идёт через VPN, DNS-запросы могут "просачиваться" через ваш провайдер. Вот как автоматически переключать VPN при утечке.

🛠 Решение на Linux (bash + OpenVPN)
#!/bin/bash  

VPN_INTERFACE="tun0"
DNS_SERVER="10.8.0.1" # DNS вашего VPN

while true; do
CURRENT_DNS=$(resolvectl | grep 'Current DNS Server' | awk '{print $4}')
if [ "$CURRENT_DNS" != "$DNS_SERVER" ]; then
echo "Утечка DNS! Перезапускаю VPN..."
systemctl restart openvpn
fi
sleep 60 # Проверка каждую минуту
done



🛠 Решение на Windows (PowerShell)
$VPNInterface = "Ethernet 2"  # Имя интерфейса VPN  
$CorrectDNS = "10.8.0.1"

while ($true) {
$CurrentDNS = (Get-DnsClientServerAddress -InterfaceAlias $VPNInterface).ServerAddresses
if ($CurrentDNS -notcontains $CorrectDNS) {
Write-Host "Обнаружена утечка DNS! Переподключаю VPN..."
Restart-Service -Name "OpenVPNService"
}
Start-Sleep -Seconds 60
}



Что ещё можно сделать?
- Использовать DNS over HTTPS (DoH) для дополнительной защиты.
- Настроить kill-switch в настройках VPN.

А вы проверяете, не "светится" ли ваш реальный IP при работе с VPN?

P.S. Если скрипт постоянно перезапускает VPN, возможно, проблема не в DNS, а в самом VPN-сервере. 🕵️‍♂️


🌐 @helcode | #bash #powershell
👍21
Как тихо собрать все метаданные в сети

Passive recon: собираем данные, не привлекая внимания

Прежде чем тестировать безопасность сети, нужно разведать её структуру. Вот как сделать это незаметно.

Сбор информации без сканирования (Linux)
# 1. ARP-таблица (уже подключённые устройства)  
arp -a

# 2. DNS-записи (если есть доступ)
dig example.com ANY

# 3. Слушаем сетевой трафик (только заголовки)
tcpdump -i eth0 -nn -c 100 'port 53 or port 80'



PowerShell-версия (Windows)
# 1. ARP-кэш  
Get-NetNeighbor

# 2. Активные подключения
Get-NetTCPConnection | Where-Object { $_.State -eq "Established" }

# 3. DNS-кэш
Get-DnsClientCache



❗️Важно:
- Не нарушайте законы! Используйте только в своей сети или с разрешения.
- Для этичного тестирования лучше Nmap (nmap -sS -T4 192.168.1.0/24).

Какие инструменты для сбора метаданных вы считаете самыми эффективными?

P.S. Если tcpdump ничего не показывает, проверьте, не блокирует ли брандмауэр трафик.


🌐 @helcode | #bash #powershell
🔥4🤔2
Автоматическое обновление Windows-серверов

Модуль PSWindowsUpdate позволяет апдейтить серверы без RDP.

1. Установка модуля
Install-Module -Name PSWindowsUpdate -Force  



2. Проверка обновлений
Get-WindowsUpdate  



3. Установка (с перезагрузкой, если нужно)
Install-WindowsUpdate -AcceptAll -AutoReboot  



4. Добавляем в планировщик
Register-ScheduledJob -Name "AutoUpdate" -ScriptBlock {  
Install-WindowsUpdate -AcceptAll -AutoReboot
} -Trigger (New-JobTrigger -Weekly -At "3:00 AM")



❗️Важно:
- Тестируйте обновления в dev-среде!
- Можно исключить конкретные KB (-NotKBArticleID "KB1234567").

Как вы обновляете Windows-серверы? WSUS, SCCM или скрипты?

P.S. Если после обновления что-то сломалось, вините Patch Tuesday.


🌐 @helcode | #powershell
👍3
Как автоматизировать создание виртуальных машин?

🫸 Хватит тыкать в GUI — создаём ВМ скриптом!

Ручное создание виртуальных машин — это прошлый век.

⚙️ Автоматизируем это с помощью Vagrant и PowerShell.

Вариант 1: Vagrant (кроссплатформенная магия)
# Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/focal64"
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
SHELL
end

Запуск:
vagrant up  # Создаёт и запускает ВМ
vagrant ssh # Подключается к ней


Вариант 2: Hyper-V + PowerShell
# Создаём новую ВМ
New-VM -Name "MyServer" -MemoryStartupBytes 4GB -NewVHDPath "C:\VMs\MyServer.vhdx" -NewVHDSizeBytes 50GB
Set-VMProcessor -VMName "MyServer" -Count 2
Start-VM -Name "MyServer"


Вопрос к вам:
Какие инструменты вы используете для автоматизации виртуальной инфраструктуры? Vagrant, Terraform, или что-то своё?

P.S. Если Vagrant говорит «box not found», проверьте, установили ли вы бокс командой vagrant box add ubuntu/focal64


🌐 @helcode | #bash #powershell
👍1
Как работать с API в PowerShell?

Отправляем запросы, не выходя из консоли!

PowerShell предлагает супер-удобные cmdlets для работы с REST API.

Базовый пример: GET-запрос
# Простой запрос
$response = Invoke-RestMethod -Uri "https://api.github.com/users/octocat"
$response.name

# С заголовками
$headers = @{
"Authorization" = "token YOUR_TOKEN"
}
$response = Invoke-RestMethod -Uri "https://api.github.com/user/repos" -Headers $headers


Отправка данных (POST)
$body = @{
name = "NewRepo"
description = "Created via PowerShell"
} | ConvertTo-Json

Invoke-RestMethod -Uri "https://api.github.com/user/repos" -Method Post -Body $body -Headers $headers -ContentType "application/json"


💬 Обсуждение:
С какими API вам чаще всего приходится работать? Расскажите о своих кейсах!

P.S. Если Invoke-RestMethod тормозит, попробуйте добавить -DisableKeepAlive

🌐 @helcode | #powershell
👍1
Pester: как писать тесты для скриптов?

Ваши скрипты заслуживают тестов!

🛠 Pester — это фреймворк для тестирования PowerShell-кода. Вот как начать.

Простейший тест
# Создаём файл MyScript.Tests.ps1
Describe "Проверка функций моего модуля" {
It "Сложение 2+2 должно возвращать 4" {
(2 + 2) | Should -Be 4
}

It "Функция Get-Hello возвращает приветствие" {
Get-Hello -Name "Alice" | Should -Be "Hello, Alice"
}
}


Запуск тестов
Invoke-Pester -Path .\MyScript.Tests.ps1


Реальный пример: тестирование функции
# BeforeAll {
# . .\MyScript.ps1 # Подгружаем тестируемый скрипт
# }

Describe "Get-Hello" {
It "Должна возвращать правильное приветствие" {
Get-Hello -Name "World" | Should -Be "Hello, World"
}
}


Пишете ли вы тесты для своих скриптов? Если да, поделитесь лучшими практиками!

P.S. Если тесты не запускаются, проверьте, установлен ли Pester: Install-Module -Name Pester -Force


🌐 @helcode | #powershell #windows #тест
Как работать с JSON в PowerShell?

🔧 Парсим, создаём и преобразуем JSON без боли!

PowerShell легко конвертирует объекты в JSON и обратно.

👨‍🔬 Преобразование объекта в JSON
$user = @{
name = "Alice"
age = 30
hobbies = @("coding", "gaming")
}
$user | ConvertTo-Json -Depth 3

# Результат:
# {
# "name": "Alice",
# "age": 30,
# "hobbies": ["coding", "gaming"]
# }


📖 Чтение JSON из файла
$data = Get-Content -Path "config.json" -Raw | ConvertFrom-Json
$data.name


Работа с вложенными свойствами
$response = Invoke-RestMethod -Uri "https://api.github.com/users/octocat"
$response.login
$response.created_at


💬 Обсуждение:
Какие самые интересные задачи с JSON вам приходилось решать в
PowerShell?

P.S. Если ConvertFrom-Json ругается на глубину, увеличьте параметр -Depth


🌐 @helcode | #powershell #json #автоматизация
👍1
Лучшие модули для DevOps

🛠 Набор must-have инструментов для каждого инженера!

Вот список модулей, которые реально экономят время.

1. PSWindowsUpdate
Install-Module -Name PSWindowsUpdate -Force
Get-WindowsUpdate -Install -AcceptAll -AutoReboot


2. Az (Azure PowerShell)
Install-Module -Name Az -Force
Connect-AzAccount
Get-AzVM


3. DBATools (для работы с БД)
Install-Module -Name dbatools -Force
Get-DbaDatabase -SqlInstance "server01" | Where-Object Name -eq "mydb"


4. PSScriptAnalyzer (проверка качества кода)
Install-Module -Name PSScriptAnalyzer -Force
Invoke-ScriptAnalyzer -Path .\MyScript.ps1


5. ImportExcel (работа с Excel без Excel)
Install-Module -Name ImportExcel -Force
Get-Process | Export-Excel -Path "processes.xlsx"


Вопрос:
Какие ваши любимые модули
PowerShell? Дополните список!

P.S. Если модуль не устанавливается, проверьте политику выполнения: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser


🌐 @helcode | #powershell
👍4
PowerShell vs. Bash: битва титанов терминала. Кто победит в скорости?

⚔️ Вечный спор: что выбрать для автоматизации под Windows/Linux? Старый добрый Bash или современный PowerShell? Один славится своей лаконичностью и скоростью на родных сервисах, другой — мощной объектной моделью и кроссплатформенностью. Но что объективно быстрее? Спойлер: ответ — «это зависит от задачи».

Давайте разберем на примере, где каждый силен.

Посчитать количество файлов с расширением .log в директории и ее поддиректориях.

Bash (Linux/macOS/WSL):
find /path/to/dir -name "*.log" | wc -l

Плюсы: максимально близко к ядру ОС. Минимальные накладные расходы. Невероятно быстр для таких системных задач.
Минусы: работает с текстом. Если нужно проанализировать атрибуты файлов — сложно.

PowerShell (Windows/Linux/macOS):
(Get-ChildItem -Path C:\path\to\dir -Filter *.log -Recurse -File).Count

Плюсы: возвращает не текст, а объекты файлов. Дальнейшая обработка (например, по дате создания или размеру) проще и не требует парсинга.
Минусы: запуск полноценного .NET runtime имеет свою стоимость. Для простых задач может быть медленнее.

Постараюсь структурировать и объяснить:
👉 Bash быстрее в чисто файловых операциях, текстовой обработке (grep, sed, awk) и запуске других процессов, потому что это нативный язык оболочки в UNIX-подобных системах.
👉 PowerShell быстрее (и точно проще), когда нужно работать со структурированными данными: объектами, JSON, XML, API. Его конвейер передает объекты, а не текст, что исключает ошибки парсинга.

Вердикт: если вам нужно быстро «выполнить и забыть» — Bash может быть шустрее. Если вы строите сложный скрипт с богатой логикой обработки данных — PowerShell выиграет за счет читаемости и мощи.

А что вы чаще используете для своих задач автоматизации?
1. Bash (старая добрая классика)
2.
PowerShell (объектная мощь)
3. Python / Другое (уже перешел на скрипты)
4. Зависит от ОС и задачи (использую тот инструмент, который лучше подходит)


P.S. Идеального инструмента нет. Есть задача и есть инструмент, который для нее лучше всего подходит. Главное — знать сильные стороны каждого!


🌐 @helcode | #bash #powershell #битва
👍31🤔1
Ты используешь PowerShell на 10%? Раскрываем скрытые возможности 7-й версии! 🚀

Многие до сих пор представляют PowerShell как просто более мощную командную строку Windows. Но это уже давно не так. PowerShell 7 — это кроссплатформенный (Windows, Linux, macOS), современный движок для автоматизации, который таит в себе фичи, способные сэкономить часы работы.

Вот несколько скрытых жемчужин, о которых вы могли не знать:

1. Параллельное выполнение с ForEach-Object -Parallel
Забудьте о медленном последовательном переборе. Теперь можно легко распараллелить задачи.

# Старое: последовательно (медленно)
1..10 | ForEach-Object { Start-Sleep -Seconds 1; "Обработан элемент $_" }

# Новое: параллельно (быстро!)
1..10 | ForEach-Object -Parallel {
Start-Sleep -Seconds 1
"Обработан элемент $_ в потоке $($env:OS)"
} -ThrottleLimit 5 # Ограничиваем число одновременных потоков


2. Условный оператор && и || (как в Bash)
Наконец-то! Знакомый синтаксис для выполнения команд по условию.

# Выполнить вторую команду, только если первая успешна
Get-Process -Name "SomeApp" && Write-Host "Процесс найден!"

# Выполнить команду, если первая провалилась
Get-Process -Name "NonExistentApp" || Write-Error "Процесс не найден"


3. Оператор нулевого слияния ?? и присваивания ??=
Пришли из C#. Идеальны для работы с потенциально $null переменными.

# Если $name is $null, использовать значение по умолчанию
$displayName = $name ?? "Неизвестный пользователь"

# Присвоить значение переменной, только если она $null
$config ??= Get-Content "config.json" | ConvertFrom-Json


4. Автодополнение на TAB для -WhatIf и -Confirm
Просто нажмите Tab после параметра -Confirm или -WhatIf, чтобы быстро выбрать $true или $false.

Эти фичи делают код не только мощнее, но и лаконичнее и читаемее. Параллелизм, удобные операторы и безопасная работа с $null — признаки современного языка скриптинга.

А вы уже перешли на PowerShell 7? Какая фича нравится больше всего?

P.S. PowerShell 7 — это как найти у своей старой собаки новые трюки. Очень крутые трюки. Советуем обновиться!


🌐 @helcode | #powershell
👍3🔥1
ForEach vs. ForEach-Object: раскладываем по полочкам скорость и применение!

В PowerShell есть два основных способа перебора коллекций, и выбор между ними — это не просто вопрос стиля, а вопрос эффективности и правильного применения. Непонимание разницы может привести к значительному замедлению скриптов, особенно при работе с большими объемами данных.

Давайте разберем два главных участника гонки.

1. ForEach (оператор языка)
Это оператор языка PowerShell. Он работает *быстрее*, но загружает всю коллекцию в память *до начала* обработки.

# Синтаксис оператора ForEach
$result = foreach ($item in $largeCollection) {
# Обработка каждого элемента
$item * 2
}


Плюсы:
- Высокая скорость выполнения. Идеален для операций в памяти.
- Удобочитаемость. Легко читается и понимается.

⛔️ Минусы:
- Потребляет больше памяти. Вся коллекция должна поместиться в оперативной памяти.

2. ForEach-Object (cmdlet в конвейере)
Это cmdlet, который чаще всего используют в конвейере (с символом |). Он обрабатывает элементы *по одному*, что экономит память.

# Синтаксис cmdlet ForEach-Object в конвейере
$result = $largeCollection | ForEach-Object -Process {
# Обработка каждого элемента
$_ * 2
}


Плюсы:
- Экономия памяти. Обрабатывает элементы потоком, не загружая все сразу. Критично для больших данных.
- Интеграция с конвейером. Можно легко встраивать в цепочки обработки.

⛔️ Минусы:
- Относительно медленнее. Из-за накладных расходов на передачу объектов по конвейеру.

🧑‍⚖️ Вердикт:
- Скорость и маленькие коллекции? Выбирайте оператор foreach.
- Большие файлы, результаты командлетов или экономия памяти? Выбирайте ForEach-Object в конвейере.

Наглядный тест:
$testData = 1..10000

Measure-Command { $r1 = foreach ($i in $testData) { $i * 2 } } | Select-Object TotalMilliseconds
Measure-Command { $r2 = $testData | ForEach-Object { $_ * 2 } } | Select-Object TotalMilliseconds

Результаты покажут, что foreach оператор заметно быстрее на таких операциях.

А вы замечали разницу в скорости? Какой метод используете чаще?

1. foreach (оператор) — скорость важнее!
2. ForEach-Object (конвейер) — привычка и удобство конвейера
3. Зависит от ситуации — использую оба, в зависимости от задачи

4. .ForEach({}) метод — есть же еще и третий вариант!

P.S. Есть еще и третий, менее известный способ — метод .ForEach({}) у коллекций. Он быстрее конвейера, но медленнее оператора. Но это уже тема для отдельного поста!


🌐 @helcode | #powershell
2👍1🤔1
Мониторим CPU и память — простые скрипты для Linux и Windows

🤔 Проблема: Сервер тормозит, но вы не знаете, в чём причина.

Решение: Скрипты для мониторинга нагрузки.

Linux (Bash + Python):
# Загрузка CPU  
top -bn1 | grep "Cpu(s)" | awk '{print "CPU: " 100 - $8 "%"}'


python  
# Загрузка памяти
import psutil
print(f"RAM: {psutil.virtual_memory().percent}%")



Windows (PowerShell):
powershell  
# CPU
Get-CimInstance Win32_Processor | Select LoadPercentage
# Память
Get-CimInstance Win32_OperatingSystem | Select FreePhysicalMemory, TotalVisibleMemorySize



👉 Добавьте алерты в Telegram — и вы всегда будете в курсе перегрузок!

🌐 @helcode | #bash #python #powershell
👍3
Скрипт упал в 3 часа ночи. Как он может сам отправить алерт в Slack или Telegram?

Запустили длинный скрипт на сервере и ушли спать? Автоматизация должна быть не только в выполнении задач, но и в оповещении о результатах. Вместо того чтобы постоянно проверять логи, научим ваши скрипты самим сообщать об успехах, ошибках или просто о завершении работы.

Отправка сообщений через популярные мессенджеры via API — это проще, чем кажется. Вот готовые рецепты.

1. Отправка в Slack через Incoming Webhook

Шаг 1: создаем входящий вебхук в вашем Slack-рабочем пространстве (Settings & administration -> Manage apps -> Incoming Webhooks).

Шаг 2: используем Invoke-RestMethod в PowerShell:

$Uri = "https://hooks.slack.com/services/your/unique/webhook/url" # Ваш URL вебхука
$Body = @{
text = " Скрипт `Backup-Database` успешно завершился на сервере $($env:COMPUTERNAME) в $(Get-Date)"
} | ConvertTo-Json

# Отправляем сообщение
Invoke-RestMethod -Uri $Uri -Method Post -Body $Body -ContentType 'application/json'


2. Отправка в Telegram через Bot API

Шаг 1: создаем бота через @BotFather и получаем его API-токен. Узнаем свой chat_id (можно написать боту, а затем вызвать https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates).

Шаг 2: пишем скрипт для отправки:

$BotToken = "1234567890:Your_Bot_Token_Here"
$ChatID = "123456789" # Ваш chat_id

# Текст сообщения
$Message = "⚠️ Внимание! Скрипт `DataProcessing` на $($env:COMPUTERNAME) завершился с ОШИБКОЙ: $($Error[0].Exception.Message)"

# Формируем URL и отправляем запрос
$TelegramAPIUrl = "https://api.telegram.org/bot$BotToken/sendMessage"
$Body = @{
chat_id = $ChatID
text = $Message
disable_notification = $false
}

Invoke-RestMethod -Uri $TelegramAPIUrl -Method Post -Body $Body -ContentType 'application/x-www-form-urlencoded'


Оба способа используют REST API и встроенный командлет Invoke-RestMethod, который идеально подходит для таких задач. Главное — надежно храните токены и URL вебхуков (например, в переменных окружения или зашифрованных конфигах).

А куда вы отправляете алерты и мониторите выполнение задач?
1. Slack — мой лучший друг по оповещениям
2. Telegram — удобно все получать в телефон
3. Email — старый добрый
Send-MailMessage
4. Microsoft Teams — корпоративный стандарт
5. Другое (Grafana, PagerDuty, etc.) — мониторинг прокачан до предела


P.S. Настроив такие оповещения, вы сможете спокойно пить кофе (или спать), пока ваши скрипты сами докладывают о результатах своей работы. Это следующий уровень автоматизации!


🌐 @helcode | #powershell
👍3
Почему Out-File и > могут подставить свинью с кодировкой?

Казалось бы, что может быть проще команды Get-Content file.txt | Out-File result.txt или dir > files.txt? Но потом вы открываете файл и видите вместо кириллицы кракозябры � или странные символы. В чем подвох? Всё дело в кодировке, которую PowerShell выбирает по умолчанию.

Проблема кроется в «умолчаниях». PowerShell (до 7-й версии) по умолчанию использует кодировку UTF-16LE (которая в мире Windows часто называется Unicode). Это широко распространенная кодировка, но у нее есть два больших минуса:
1. Она использует два байта на символ, что увеличивает размер файла.
2. Многие внешние инструменты (например, классический notepad.exe, системы Linux) ожидают увидеть кодировку UTF-8 или ASCII.

Пример проблемы:
# Записываем строку с кириллицей
"Привет, мир!" > test.txt

Откройте test.txt в Блокноте (Notepad) — вы увидите текст корректно. Но попробуйте посмотреть его в консоли Linux с помощью cat или обработать другим скриптом — высока вероятность увидеть проблемы.

Как это исправить? Явно указываем кодировку с помощью -Encoding.

1. Для максимальной совместимости (особенно с другими ОС и инструментами) используйте UTF-8:
"Привет, мир!" | Out-File -FilePath .\test.txt -Encoding utf8
# Или для PowerShell 7.2+, где есть UTF-8 без BOM (самый современный вариант):
"Привет, мир!" | Out-File -FilePath .\test.txt -Encoding utf8NoBOM


2. Если вам нужна обратная совместимость со старыми приложениями Windows (например, для файлов конфигурации .ini), используйте ASCII или UTF-8 с BOM:
Get-Process | Out-File proc_list.txt -Encoding ascii # Только англ. символы
Get-Service | Out-File services.txt -Encoding utf8 # UTF-8 с меткой (BOM)


3. Если вы работаете исключительно в среде Windows и вам нужна поддержка Unicode — тогда используйте стандартную кодировку:
# Тот самый вариант по умолчанию
Get-Content input.log | Out-File output.log -Encoding unicode


Метка (BOM) в начале файла помогает редакторам понять кодировку, но некоторые инструменты (например, скрипты на Linux) могут ее не понимать. Поэтому utf8NoBOM — это часто самый универсальный выбор для новых проектов.

А вы сталкивались с проблемами кодировки? Какую предпочитаете использовать?
1.
utf8NoBOM (современно и универсально)
2.
utf8 (с меткой, для уверенности в Windows)
3. ascii (только для английского текста)
4. Не заморачиваюсь, использую стандартную (пока не прижмет) 😅
5. Другая (поделитесь опытом в комментариях!)


P.S. Правильно выбранная кодировка — это как отправить письмо на языке, который адресат точно поймет. Out-File по умолчанию говорит на диалекте, который понимают не все. Всегда указывайте -Encoding для важных файлов!


🌐 @helcode | #powershell
👍3
Как автоматизация меняет мышление

🦾 После 50+ скриптов начинаешь видеть мир иначе:
1. Декомпозиция — любая задача = последовательность шагов.
2. Параноидальная проверка ошибок — «А что, если файла нет?»
3. Документирование всего — даже скрипт для кофеварки.

📈 Стадии роста:
*Страх* → *Копирование* → *Адаптация* → *Создание с нуля*

⚙️ Пример PowerShell:
# Стадия 1: Get-Service  
# Стадия 4: Скрипт с алертами и историей
function Get-FailedServices {
$services = Get-Service | Where-Object {
$_.Status -ne 'Running' -and $_.StartType -eq 'Automatic'
}
if ($services.Count -gt 3) { Send-Alert "Сломано: $($services.Count) служб!" }
}



На какой стадии автоматизации вы сейчас?


🌐 @helcode | #powershell #автоматизация
👍2