Почему -ErrorAction SilentlyContinue — это зло?
🚨 Проблемы:
- Ошибки пропадают, а скрипт продолжает работать с битыми данными.
- Невозможно отладить, потому что вы даже не знаете, что что-то сломалось.
Что делать вместо этого?
❓Когда можно использовать SilentlyContinue?
Только если ошибка ожидаема и не критична (например, проверка, существует ли файл перед удалением).
👉 Вы тоже когда-то глушили ошибки, а потом час искали баг? Поделитесь в коментариях!
🌐 @automate_today | #powershell
-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?
Хотите управлять сайтами, пулами приложений или настройками SSL без ручного кликания? PowerShell спешит на помощь!
Примеры:
Плюсы:
- Можно полностью автоматизировать развёртывание.
- Интеграция с Ansible/Terraform (через PowerShell-провижнры).
👉 Кто ещё ненавидит IIS Manager? Дайте знать!
🌐 @automate_today | #powershell
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 и медленные запросы — вечная история
Если ваш
🛠 Ускоряем запросы:
❓Почему это работает?
-
-
-
🧑💻 Тест:
Попробуйте оба варианта с
А какие у вас есть способы ускорения HTTP-запросов в PowerShell?
🌐 @automate_today | #powershell
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:
Как запустить?
❓Зачем это нужно?
- Ловите баги до того, как скрипт уйдёт в продакшн.
- Рефакторинг становится безопаснее.
- Можно интегрировать в CI/CD (GitHub Actions, Azure DevOps).
А вы тестируете свои скрипты? Если да — какими инструментами?
🌐 @automate_today | #powershell
Если вы пишете 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-команда для поиска:
🛠 PowerShell-вариант:
🛠 Что дальше?
- Удалить:
- Заменить на актуальные пути.
А вы часто сталкиваетесь с битыми ссылками?
🌐 @automate_today | #bash #powershell
"Мёртвые" симлинки — тихие убийцы свободного места
Битые символьные ссылки (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)
🛠 Решение на Windows (PowerShell)
❔Что ещё можно сделать?
- Использовать DNS over HTTPS (DoH) для дополнительной защиты.
- Настроить kill-switch в настройках VPN.
А вы проверяете, не "светится" ли ваш реальный IP при работе с VPN?
🌐 @helcode | #bash #powershell
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
👍2❤1
Как тихо собрать все метаданные в сети
Passive recon: собираем данные, не привлекая внимания
Прежде чем тестировать безопасность сети, нужно разведать её структуру. Вот как сделать это незаметно.
Сбор информации без сканирования (Linux)
PowerShell-версия (Windows)
❗️Важно:
- Не нарушайте законы! Используйте только в своей сети или с разрешения.
- Для этичного тестирования лучше Nmap (
Какие инструменты для сбора метаданных вы считаете самыми эффективными?
🌐 @helcode | #bash #powershell
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-серверов
Модуль
1. Установка модуля
2. Проверка обновлений
3. Установка (с перезагрузкой, если нужно)
4. Добавляем в планировщик
❗️Важно:
- Тестируйте обновления в dev-среде!
- Можно исключить конкретные KB (
Как вы обновляете Windows-серверы? WSUS, SCCM или скрипты?
🌐 @helcode | #powershell
Модуль
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 (кроссплатформенная магия)
Запуск:
Вариант 2: Hyper-V + PowerShell
❔Вопрос к вам:
Какие инструменты вы используете для автоматизации виртуальной инфраструктуры? Vagrant, Terraform, или что-то своё?
🌐 @helcode | #bash #powershell
🫸 Хватит тыкать в 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-запрос
Отправка данных (POST)
💬 Обсуждение:
С какими API вам чаще всего приходится работать? Расскажите о своих кейсах!
P.S.Если Invoke-RestMethod тормозит, попробуйте добавить -DisableKeepAlive
🌐 @helcode | #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.
🌐 @helcode | #powershell
👍1
Pester: как писать тесты для скриптов?
Ваши скрипты заслуживают тестов!
🛠 Pester — это фреймворк для тестирования PowerShell-кода. Вот как начать.
Простейший тест
Запуск тестов
Реальный пример: тестирование функции
Пишете ли вы тесты для своих скриптов? Если да, поделитесь лучшими практиками!
🌐 @helcode | #powershell #windows #тест
Ваши скрипты заслуживают тестов!
🛠 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
📖 Чтение JSON из файла
Работа с вложенными свойствами
💬 Обсуждение:
Какие самые интересные задачи с JSON вам приходилось решать в PowerShell?
🌐 @helcode | #powershell #json #автоматизация
🔧 Парсим, создаём и преобразуем 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
2. Az (Azure PowerShell)
3. DBATools (для работы с БД)
4. PSScriptAnalyzer (проверка качества кода)
5. ImportExcel (работа с Excel без Excel)
Вопрос:
Какие ваши любимые модули PowerShell? Дополните список!
🌐 @helcode | #powershell
🛠 Набор 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? Один славится своей лаконичностью и скоростью на родных сервисах, другой — мощной объектной моделью и кроссплатформенностью. Но что объективно быстрее? Спойлер:ответ — «это зависит от задачи».
Давайте разберем на примере, где каждый силен.
Посчитать количество файлов с расширением
Bash (Linux/macOS/WSL):
➕ Плюсы: максимально близко к ядру ОС. Минимальные накладные расходы. Невероятно быстр для таких системных задач.
➖ Минусы: работает с текстом. Если нужно проанализировать атрибуты файлов — сложно.
PowerShell (Windows/Linux/macOS):
➕ Плюсы: возвращает не текст, а объекты файлов. Дальнейшая обработка (например, по дате создания или размеру) проще и не требует парсинга.
➖ Минусы: запуск полноценного .NET runtime имеет свою стоимость. Для простых задач может быть медленнее.
Постараюсь структурировать и объяснить:
👉 Bash быстрее в чисто файловых операциях, текстовой обработке (
👉 PowerShell быстрее (и точно проще), когда нужно работать со структурированными данными: объектами, JSON, XML, API. Его конвейер передает объекты, а не текст, что исключает ошибки парсинга.
Вердикт: если вам нужно быстро «выполнить и забыть» — Bash может быть шустрее. Если вы строите сложный скрипт с богатой логикой обработки данных — PowerShell выиграет за счет читаемости и мощи.
А что вы чаще используете для своих задач автоматизации?
1. Bash (старая добрая классика)
2. PowerShell (объектная мощь)
3. Python / Другое (уже перешел на скрипты)
4. Зависит от ОС и задачи (использую тот инструмент, который лучше подходит)
🌐 @helcode | #bash #powershell #битва
⚔️ Вечный спор: что выбрать для автоматизации под 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 #битва
👍3❤1🤔1
Ты используешь PowerShell на 10%? Раскрываем скрытые возможности 7-й версии! 🚀
Многие до сих пор представляют PowerShell как просто более мощную командную строку Windows. Но это уже давно не так. PowerShell 7 — это кроссплатформенный (Windows, Linux, macOS), современный движок для автоматизации, который таит в себе фичи, способные сэкономить часы работы.
Вот несколько скрытых жемчужин, о которых вы могли не знать:
1. Параллельное выполнение с
Забудьте о медленном последовательном переборе. Теперь можно легко распараллелить задачи.
2. Условный оператор
Наконец-то! Знакомый синтаксис для выполнения команд по условию.
3. Оператор нулевого слияния
Пришли из C#. Идеальны для работы с потенциально
4. Автодополнение на TAB для
Просто нажмите
Эти фичи делают код не только мощнее, но и лаконичнее и читаемее. Параллелизм, удобные операторы и безопасная работа с
А вы уже перешли на PowerShell 7? Какая фича нравится больше всего?
🌐 @helcode | #powershell
Многие до сих пор представляют 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.
Это оператор языка PowerShell. Он работает *быстрее*, но загружает всю коллекцию в память *до начала* обработки.
✅ Плюсы:
- Высокая скорость выполнения. Идеален для операций в памяти.
- Удобочитаемость. Легко читается и понимается.
⛔️ Минусы:
- Потребляет больше памяти. Вся коллекция должна поместиться в оперативной памяти.
2.
Это cmdlet, который чаще всего используют в конвейере (с символом
✅ Плюсы:
- Экономия памяти. Обрабатывает элементы потоком, не загружая все сразу. Критично для больших данных.
- Интеграция с конвейером. Можно легко встраивать в цепочки обработки.
⛔️ Минусы:
- Относительно медленнее. Из-за накладных расходов на передачу объектов по конвейеру.
🧑⚖️ Вердикт:
- Скорость и маленькие коллекции? Выбирайте оператор
- Большие файлы, результаты командлетов или экономия памяти? Выбирайте
Наглядный тест:
Результаты покажут, что foreach оператор заметно быстрее на таких операциях.
А вы замечали разницу в скорости? Какой метод используете чаще?
1.
2.
3. Зависит от ситуации — использую оба, в зависимости от задачи
4.
🌐 @helcode | #powershell
В 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):
Windows (PowerShell):
👉 Добавьте алерты в Telegram — и вы всегда будете в курсе перегрузок!
🌐 @helcode | #bash #python #powershell
🤔 Проблема: Сервер тормозит, но вы не знаете, в чём причина.
✅ Решение: Скрипты для мониторинга нагрузки.
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: используем
2. Отправка в Telegram через Bot API
Шаг 1: создаем бота через @BotFather и получаем его API-токен. Узнаем свой
Шаг 2: пишем скрипт для отправки:
Оба способа используют REST API и встроенный командлет
А куда вы отправляете алерты и мониторите выполнение задач?
1. Slack — мой лучший друг по оповещениям
2. Telegram — удобно все получать в телефон
3. Email — старый добрый
4. Microsoft Teams — корпоративный стандарт
5. Другое (Grafana, PagerDuty, etc.) — мониторинг прокачан до предела
🌐 @helcode | #powershell
Запустили длинный скрипт на сервере и ушли спать? Автоматизация должна быть не только в выполнении задач, но и в оповещении о результатах. Вместо того чтобы постоянно проверять логи, научим ваши скрипты самим сообщать об успехах, ошибках или просто о завершении работы.
Отправка сообщений через популярные мессенджеры 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 и > могут подставить свинью с кодировкой?
Казалось бы, что может быть проще команды
Проблема кроется в «умолчаниях». PowerShell (до 7-й версии) по умолчанию использует кодировку UTF-16LE (которая в мире Windows часто называется Unicode). Это широко распространенная кодировка, но у нее есть два больших минуса:
1. Она использует два байта на символ, что увеличивает размер файла.
2. Многие внешние инструменты (например, классический
Пример проблемы:
Откройте
❔ Как это исправить? Явно указываем кодировку с помощью
1. Для максимальной совместимости (особенно с другими ОС и инструментами) используйте UTF-8:
2. Если вам нужна обратная совместимость со старыми приложениями Windows (например, для файлов конфигурации .ini), используйте ASCII или UTF-8 с BOM:
3. Если вы работаете исключительно в среде Windows и вам нужна поддержка Unicode — тогда используйте стандартную кодировку:
Метка (BOM) в начале файла помогает редакторам понять кодировку, но некоторые инструменты (например, скрипты на Linux) могут ее не понимать. Поэтому
А вы сталкивались с проблемами кодировки? Какую предпочитаете использовать?
1.
2.
3.
4. Не заморачиваюсь, использую стандартную (пока не прижмет) 😅
5. Другая (поделитесь опытом в комментариях!)
🌐 @helcode | #powershell
Казалось бы, что может быть проще команды
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:
На какой стадии автоматизации вы сейчас?
🌐 @helcode | #powershell #автоматизация
🦾 После 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