Какой у вас опыт работы с PowerShell?

«Какой у вас опыт работы с PowerShell?» — вопрос из категории Linux и командная строка, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Использовал PowerShell для автоматизации задач в среде Windows, связанных с тестированием и DevOps.

Основные сценарии применения:

  • Автоматизация подготовки тестового окружения: Создание/удаление виртуальных машин, установка ПО, настройка служб.
  • Управление службами и процессами: Запуск, остановка, проверка статуса сервисов, необходимых для тестов.
  • Парсинг и анализ логов: Фильтрация, поиск ошибок и генерация сводок из текстовых и структурированных (JSON, XML) логов.
  • Взаимодействие с API: Отправка HTTP-запросов для проверки REST-сервисов.
  • Модульное тестирование скриптов: Использовал фреймворк Pester для написания тестов на сами PowerShell-скрипты.

Пример скрипта для проверки состояния сервиса и логирования:

# check-and-log-service.ps1
$ServiceName = "MyWebService"
$LogFile = "C:Logsservice_check_$(Get-Date -Format 'yyyyMMdd').log"

$Service = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue

if (-not $Service) {
    "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - ERROR: Service '$ServiceName' not found." | Out-File -FilePath $LogFile -Append
    exit 1
}

if ($Service.Status -ne 'Running') {
    "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - WARNING: Service '$ServiceName' is in state '$($Service.Status)'. Attempting to start..." | Out-File -FilePath $LogFile -Append
    Start-Service -Name $ServiceName
    Start-Sleep -Seconds 10
    $Service.Refresh()
    if ($Service.Status -eq 'Running') {
        "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - INFO: Service started successfully." | Out-File -FilePath $LogFile -Append
    } else {
        "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - ERROR: Failed to start service." | Out-File -FilePath $LogFile -Append
        exit 1
    }
} else {
    "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - INFO: Service '$ServiceName' is running." | Out-File -FilePath $LogFile -Append
}

Также знаком с основными концепциями: конвейеры (pipeline), модули, работа с объектами .NET, профили.