Skip to content
Back to skills

Lang Powershell

ASecurity

Fornece padrões de engenharia de software em PowerShell (Windows PowerShell 5.1 e PowerShell 7+ Core). Cobre automação, gestão de pipeline de objetos, modularização (módulos de script/manifestos), tratamento de erros defensivo (Try/Catch/Finally, ErrorActionPreference), tipagem forte, PSCustomObject e boas práticas de segurança (ExecutionPolicy, remoting e credenciais).

  • 10 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 8, 2026
businessgoshellexpressapi

Works with

  • api

Security analysis

A100/100

Scanned September 8, 2026

npx -y skills add dandgabr/skills --skill lang-powershell --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Lang Powershell?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Lang Powershell
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/dandgabr-lang-powershell/badge)](https://www.skillsdirectory.com/skills/dandgabr-lang-powershell)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: "lang-powershell"
description: "Fornece padrões de engenharia de software em PowerShell (Windows PowerShell 5.1 e PowerShell 7+ Core). Cobre automação, gestão de pipeline de objetos, modularização (módulos de script/manifestos), tratamento de erros defensivo (Try/Catch/Finally, ErrorActionPreference), tipagem forte, PSCustomObject e boas práticas de segurança (ExecutionPolicy, remoting e credenciais)."
---

# Habilidade de IA: Engenharia de PowerShell (PowerShell Specialist)

Esta skill orienta a inteligência artificial a atuar como especialista no ecossistema **PowerShell** (suportando tanto Windows PowerShell 5.1 quanto PowerShell 7+ Cross-Platform), com foco em scripts robustos, modulares, testáveis e com alto desempenho em automação de infraestrutura e sistemas.

---

## 🧭 Diretrizes de Desenvolvimento em PowerShell

Ao atuar nesta skill, aplique rigorosamente os seguintes padrões:

### 1. Orientação a Objetos e Uso do Pipeline
- **Retorne Objetos, Não Texto**: Evite formatar saídas como texto cru ou usar `Write-Host` para dados estruturados. Em vez disso, emita objetos usando `[PSCustomObject]` ou `Write-Output`.
- **`Write-Host` vs `Write-Information` / `Write-Verbose`**: Use `Write-Verbose` para logs detalhados, `Write-Warning` para alertas e `Write-Error` para falhas. Evite `Write-Host` a menos que esteja criando uma interface interativa específica no console.
- **Pipeline-Awareness**: Projete funções avançadas para aceitar entrada via pipeline (`ValueFromPipeline` ou `ValueFromPipelineByPropertyName`).

### 2. Tratamento de Erros e Execução Defensiva
- **Parada em Erros**: Utilize `$ErrorActionPreference = 'Stop'` no topo dos scripts ou use `-ErrorAction Stop` em cmdlets específicos para garantir que erros não críticos (*non-terminating errors*) sejam convertidos em exceções capturáveis.
- **Blocos Try / Catch / Finally**: Sempre envolva chamadas a APIs nativas do .NET ou operações de E/S em blocos `Try/Catch` tipados:
  ```powershell
  try {
      [System.IO.File]::ReadAllText($filePath)
  } catch [System.IO.FileNotFoundException] {
      Write-Error "Arquivo não encontrado: $filePath"
  } catch {
      Write-Error "Erro inesperado: $_"
  }
  ```

### 3. Funções Avançadas e CmdletBinding
- **Uso de `[CmdletBinding()]`**: Todas as funções reutilizáveis devem declarar `[CmdletBinding()]` para suportar parâmetros comuns como `-Verbose`, `-Debug`, `-ErrorAction` e `-WhatIf` / `-Confirm` (quando houver suporte a `SupportsShouldProcess`).
- **Validação Estrita de Parâmetros**: Adicione atributos de validação como `[ValidateNotNullOrEmpty()]`, `[ValidateSet()]` ou `[ValidateRange()]`.

### 4. Desempenho e Tipagem Forte
- **Evitar Concatenação de Arrays (`+=`)**: O operador `+=` recria todo o array na memória a cada iteração. Para coleções grandes, use `[System.Collections.Generic.List[PSObject]]` ou atribua o resultado do loop diretamente a uma variável:
  ```powershell
  $results = foreach ($item in $items) {
      [PSCustomObject]@{
          Id   = $item.Id
          Name = $item.Name
      }
  }
  ```
- **Tipagem de Parâmetros**: Declare explicitamente os tipos de todos os parâmetros (`[string]`, `[int]`, `[switch]`, `[datetime]`) para evitar coerção implícita e comportamentos inesperados.

### 5. Segurança e Boas Práticas
- **Evitar `Invoke-Expression` (iex)**: Nunca utilize `Invoke-Expression` com strings construídas dinamicamente ou oriundas de fontes não confiáveis para prevenir injeção de código.
- **Gerenciamento de Credenciais**: Nunca insira senhas ou tokens como texto limpo (*hardcoded*). Utilize `[PSCredential]`, o módulo `SecretManagement` ou variáveis de ambiente seguras.

---

## 🧰 Padrões de Código Recomendados

### Função Avançada Completa com Suporte a Pipeline e Validation

```powershell
function Get-SystemServiceReport {
    [CmdletBinding(SupportsShouldProcess = $false)]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [ValidateNotNullOrEmpty()]
        [string[]]$ServiceName,

        [Parameter(Mandatory = $false)]
        [ValidateSet('Running', 'Stopped', 'All')]
        [string]$StatusFilter = 'All'
    )

    begin {
        Write-Verbose "Iniciando relatório de serviços..."
        $results = [System.Collections.Generic.List[PSCustomObject]]::new()
    }

    process {
        foreach ($name in $ServiceName) {
            Write-Verbose "Processando serviço: $name"
            try {
                $service = Get-Service -Name $name -ErrorAction Stop
                
                if ($StatusFilter -eq 'All' -or $service.Status -eq $StatusFilter) {
                    $results.Add([PSCustomObject]@{
                        ServiceName = $service.Name
                        DisplayName = $service.DisplayName
                        Status      = $service.Status.ToString()
                        StartType   = $service.StartType.ToString()
                        Timestamp   = [DateTime]::UtcNow
                    })
                }
            } catch [Microsoft.PowerShell.Commands.ServiceCommandException] {
                Write-Warning "Serviço não encontrado: $name"
            } catch {
                Write-Error "Erro ao consultar o serviço $name: $_"
            }
        }
    }

    end {
        Write-Verbose "Relatório concluído com $($results.Count) item(ns)."
        return $results
    }
}

# Exemplo de Uso via Pipeline:
# @('wuauserv', 'Spooler', 'NonExistentService') | Get-SystemServiceReport -StatusFilter Running -Verbose
```

### Script de Automação com Robustez e Logs Structurados

```powershell
# Requires -Version 5.1
$ErrorActionPreference = 'Stop'

function Invoke-MaintenanceTask {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [string]$TargetDirectory,

        [Parameter(Mandatory = $false)]
        [int]$DaysOld = 30
    )

    if (-not (Test-Path -Path $TargetDirectory -PathType Container)) {
        throw [System.IO.DirectoryNotFoundException]::new("O diretório de destino não existe: $TargetDirectory")
    }

    $cutoffDate = (Get-Date).AddDays(-$DaysOld)
    Write-Verbose "Limpando arquivos anteriores a $cutoffDate em $TargetDirectory"

    $filesToRemove = Get-ChildItem -Path $TargetDirectory -File -Recurse | 
        Where-Object { $_.LastWriteTime -lt $cutoffDate }

    $removedCount = 0
    foreach ($file in $filesToRemove) {
        try {
            Remove-Item -Path $file.FullName -Force -ErrorAction Stop
            $removedCount++
            Write-Verbose "Arquivo removido: $($file.FullName)"
        } catch {
            Write-Warning "Falha ao remover $($file.FullName): $_"
        }
    }

    return [PSCustomObject]@{
        TargetDirectory = $TargetDirectory
        FilesEvaluated  = $filesToRemove.Count
        FilesRemoved    = $removedCount
        ExecutionTime   = [DateTime]::Now
    }
}
```

## 🔒 Questões de Segurança e Práticas Seguras

- **Injeção de Script (`Invoke-Expression`)**: Evite usar `Invoke-Expression` ou `iex` com entradas do usuário. Use objetos com tipagem forte ou passe parâmetros via `ScriptBlock` parametrizado.
- **Bypasses de Execução e EDR**: Lembre-se de que a política de execução (`ExecutionPolicy`) é uma proteção contra acidentes, não um limite de segurança; atacantes conseguem contorná-la facilmente (ex: `-ExecutionPolicy Bypass`).
- **Segredos Hardcoded**: Nunca armazene senhas ou tokens em variáveis no código dos scripts. Utilize o utilitário `SecretManagement` ou criptografia DPAPI (`SecureString`).

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.