> ## Documentation Index
> Fetch the complete documentation index at: https://help.gorelo.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Usar variáveis em tempo de execução

> Use variáveis de script do Gorelo deixadas em branco no design para solicitar entrada em execuções sob demanda via CLI, ideal para Wake on LAN e tarefas pontuais.

Você pode deixar uma variável de script em branco e fazer com que ela solicite a entrada do usuário quando executada sob demanda pela CLI. Este exemplo envia um pacote WOL para um endereço MAC informado em tempo de execução.

<Steps>
  <Step title="Crie o script.">
    1. Acesse **[Scripts](https://app.gorelo.io/Asset/script-list)**.
    2. Crie um script com os seguintes detalhes:
       * **Nome**: Wake on LAN
       * **Conteúdo**:

    ```powershell theme={null}
    $MacToWake = $gorelo:MacToWake


    function Send-WoL {
        [CmdletBinding()]
        param(
            [Parameter(Mandatory)]
            [string]$MacAddress,

            # Optional: force a specific interface by alias (e.g., "Wi-Fi")
            [string]$InterfaceAlias
        )

        # --- Normalize & validate MAC ---
        $norm = $MacAddress -replace '[:\-\. ]',''
        if ($norm -notmatch '^[0-9A-Fa-f]{12}$') { throw "Invalid MAC after normalization: '$norm'." }

        $macBytes = New-Object byte[] 6
        for ($i = 0; $i -lt 12; $i += 2) { $macBytes[$i/2] = [Convert]::ToByte($norm.Substring($i,2),16) }

        # --- Build magic packet ---
        $packet = New-Object byte[] (6 + 16*6)
        for ($i=0; $i -lt 6; $i++) { $packet[$i] = 0xFF }
        for ($block=0; $block -lt 16; $block++) { [Array]::Copy($macBytes, 0, $packet, 6 + ($block*6), 6) }

        # --- Pick active IPv4 from interface with best default route (0.0.0.0/0) ---
        $route = Get-NetRoute -DestinationPrefix '0.0.0.0/0' -ErrorAction SilentlyContinue |
                 Sort-Object -Property RouteMetric, InterfaceMetric |
                 Select-Object -First 1

        $ipRec = $null
        if ($InterfaceAlias) {
            $ipRec = Get-NetIPAddress -AddressFamily IPv4 -InterfaceAlias $InterfaceAlias -ErrorAction SilentlyContinue |
                     Where-Object { $_.IPAddress -notlike '169.254*' -and $_.IPAddress -ne '127.0.0.1' } |
                     Sort-Object -Property PrefixLength -Descending |
                     Select-Object -First 1
        }
        if (-not $ipRec -and $route) {
            $ipRec = Get-NetIPAddress -AddressFamily IPv4 -InterfaceIndex $route.InterfaceIndex -ErrorAction SilentlyContinue |
                     Where-Object { $_.IPAddress -notlike '169.254*' -and $_.IPAddress -ne '127.0.0.1' } |
                     Select-Object -First 1
        }
        if (-not $ipRec) {
            $ipRec = Get-NetIPAddress -AddressFamily IPv4 -ErrorAction SilentlyContinue |
                     Where-Object { $_.IPAddress -notlike '169.254*' -and $_.IPAddress -ne '127.0.0.1' } |
                     Select-Object -First 1
        }
        if (-not $ipRec) { throw "Couldn't detect a valid IPv4 address." }

        $ipBytes = ([System.Net.IPAddress]::Parse($ipRec.IPAddress)).GetAddressBytes()
        $prefix  = [int]$ipRec.PrefixLength

        # --- Build subnet mask bytes from prefix length (no Int32 conversion) ---
        $maskBytes = 0,0,0,0
        $bits = $prefix
        for ($i=0; $i -lt 4; $i++) {
            if ($bits -ge 8) { $maskBytes[$i] = 255; $bits -= 8 }
            elseif ($bits -gt 0) {
                $maskBytes[$i] = (0xFF - ( [math]::Pow(2, (8 - $bits)) - 1 )) -band 0xFF
                $bits = 0
            } else { $maskBytes[$i] = 0 }
        }

        # --- Compute broadcast: ip OR (NOT mask) (byte-wise) ---
        $broadcastBytes = New-Object byte[] 4
        for ($i=0; $i -lt 4; $i++) {
            $invMask = (0xFF - $maskBytes[$i]) -band 0xFF
            $broadcastBytes[$i] = ($ipBytes[$i] -bor $invMask) -band 0xFF
        }
        $broadcast = [System.Net.IPAddress]::new($broadcastBytes)

        # --- Send to common WoL ports ---
        foreach ($port in 9,7) {
            $udp = New-Object System.Net.Sockets.UdpClient
            $udp.EnableBroadcast = $true
            $endpoint = New-Object System.Net.IPEndPoint $broadcast, $port
            [void]$udp.Send($packet, $packet.Length, $endpoint)
            $udp.Close()
            Write-Host "Magic packet sent to $MacAddress via $($broadcast.ToString()):$port"
        }
    }

    # Example:
    # Send-WoL -MacAddress "98:FA:9B:55:B4:50"
    # Or force a specific adapter:
    # Send-WoL -MacAddress "98:FA:9B:55:B4:50" -InterfaceAlias "Wi-Fi"


    # Example usage
    Send-WoL -MacAddress $MacToWake 
    ```
  </Step>

  <Step title="Adicione a variável de script MacToWake e deixe o campo de valor em branco.">
    <Frame>
      <img src="https://mintcdn.com/gorelo/ETmIq0ooqo1JIpTZ/images/image-125.png?fit=max&auto=format&n=ETmIq0ooqo1JIpTZ&q=85&s=f6456c036a33e9afd39ad84c21872b8e" alt="Image 125" width="543" height="312" data-path="images/image-125.png" />
    </Frame>
  </Step>

  <Step title="Salve o script." />

  <Step title="Fixe o script pelo menu de 3 pontos para que fique disponível na CLI." />
</Steps>

<Tip>
  Escreva o endereço MAC em um script de campo personalizado neste **[guia](/install-via-custom-fields)**.
</Tip>
