all repos — fast-scripts @ af64d5aa730c850879168c65bf30932952ea591e

scripts que podem ser uteis para meu dia a dia

feat: fix
Pablo Murad pablo@pablomurad.com
Sat, 12 Sep 2026 00:10:24 -0300
commit

af64d5aa730c850879168c65bf30932952ea591e

parent

3f48e7050a4830ba23b9dcf562e3497758ed9bc9

M Imagens/converter-imagens.cmdImagens/converter-imagens.cmd

@@ -38,7 +38,7 @@ }

return $null } -function Salvar-Config($entrada, $formato, $modo, $valor) { +function Salvar-Config($entrada, $formato, $modo, $valor, $saida) { try { New-Item -ItemType Directory -Path $configDir -Force | Out-Null [pscustomobject]@{

@@ -46,6 +46,7 @@ UltimaEntrada = $entrada

UltimoFormato = $formato UltimoModo = $modo UltimoValor = $valor + UltimaSaida = $saida } | ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8 } catch {} }

@@ -230,7 +231,20 @@ else {

$resumoTam = 'sem redimensionar' } -Salvar-Config $origem $formato.Id $modo $valor +# Pasta de saída (lembra a última; cria se não existir) +$saidaPadrao = if ($config -and $config.UltimaSaida) { $config.UltimaSaida } else { $destino } +while ($true) { + Titulo 'Pasta de saída' + Write-Host " $saidaPadrao" -ForegroundColor White + Write-Host 'Enter = usar esta pasta | ou cole/digite outra' -ForegroundColor DarkGray + $rsaida = Read-Host 'Pasta de saída' + $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') } + try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break } + catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow } +} +$destino = (Resolve-Path -LiteralPath $destino).Path + +Salvar-Config $origem $formato.Id $modo $valor $destino # ------------------------------------------------------------ # 5) Coleta das imagens
M Imagens/imagens-e-pdf.cmdImagens/imagens-e-pdf.cmd

@@ -21,6 +21,10 @@ Write-Host '============================================================' -ForegroundColor DarkCyan

} $extImg = @('.jpg','.jpeg','.png','.webp','.bmp','.tif','.tiff') +$configDir = Join-Path $env:APPDATA 'ImagensEPdf' +$configFile = Join-Path $configDir 'config.json' +function Carregar-Config { if (Test-Path -LiteralPath $configFile) { try { return Get-Content -LiteralPath $configFile -Raw -Encoding UTF8 | ConvertFrom-Json } catch {} }; return $null } +function Salvar-Config($o) { try { New-Item -ItemType Directory -Path $configDir -Force | Out-Null; $o | ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8 } catch {} } Titulo 'Imagens e PDF' Write-Host ' Desenvolvido por Pablo Murad - 2026' -ForegroundColor DarkGray

@@ -29,6 +33,7 @@ Write-Host 'Verificando o que é necessário...' -ForegroundColor Gray

$magick = Get-Command magick -ErrorAction SilentlyContinue if (-not $magick) { Write-Host ''; Write-Host '[ERRO] ImageMagick não encontrado.' -ForegroundColor Red; Write-Host 'Instale com: winget install ImageMagick.ImageMagick' -ForegroundColor White; Pausar; exit 1 } Write-Host "[OK] ImageMagick: $($magick.Source)" -ForegroundColor Green +$config = Carregar-Config Titulo 'O que você quer fazer?' Write-Host ' [1] Imagens -> PDF (junta todas as imagens de uma pasta num PDF)' -ForegroundColor White

@@ -51,7 +56,19 @@ Write-Host "$($imagens.Count) imagens encontradas (em ordem alfabética)." -ForegroundColor Cyan

$nome = (Read-Host 'Nome do PDF de saída (Enter = saida.pdf)').Trim() if ([string]::IsNullOrWhiteSpace($nome)) { $nome = 'saida.pdf' } if ($nome -notmatch '\.pdf$') { $nome += '.pdf' } - $pdf = Join-Path $pasta $nome + $saidaPadrao = if ($config -and $config.UltimaSaidaPdf) { $config.UltimaSaidaPdf } else { $pasta } + while ($true) { + Titulo 'Pasta de saída' + Write-Host " $saidaPadrao" -ForegroundColor White + Write-Host 'Enter = usar esta pasta | ou cole/digite outra' -ForegroundColor DarkGray + $rsaida = Read-Host 'Pasta de saída' + $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') } + try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break } + catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow } + } + $destino = (Resolve-Path -LiteralPath $destino).Path + Salvar-Config ([pscustomobject]@{ UltimaSaidaPdf=$destino; UltimaSaidaImg=($config.UltimaSaidaImg) }) + $pdf = Join-Path $destino $nome Write-Host ''; Write-Host "Gerando: $pdf ..." -ForegroundColor Cyan $imgArgs = @($imagens.FullName) + @('-auto-orient', $pdf) & magick @imgArgs

@@ -82,10 +99,25 @@

if ($modoArquivo) { $pdfs = @(Get-Item -LiteralPath $pdfAlvo) } else { $pdfs = @(Get-ChildItem -LiteralPath $pdfAlvo -File | Where-Object { $_.Extension.ToLowerInvariant() -eq '.pdf' }) } if ($pdfs.Count -eq 0) { Write-Host 'Nenhum PDF encontrado.' -ForegroundColor Yellow; Pausar; exit 0 } +$baseSaida = if ($modoArquivo) { Split-Path $pdfAlvo -Parent } else { $pdfAlvo } +$saidaPadrao = if ($config -and $config.UltimaSaidaImg) { $config.UltimaSaidaImg } else { $baseSaida } +while ($true) { + Titulo 'Pasta de saída (base)' + Write-Host " $saidaPadrao" -ForegroundColor White + Write-Host '(cada PDF cria uma subpasta <nome>-imagens aqui dentro)' -ForegroundColor DarkGray + Write-Host 'Enter = usar esta pasta | ou cole/digite outra' -ForegroundColor DarkGray + $rsaida = Read-Host 'Pasta de saída' + $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') } + try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break } + catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow } +} +$destino = (Resolve-Path -LiteralPath $destino).Path +Salvar-Config ([pscustomobject]@{ UltimaSaidaPdf=($config.UltimaSaidaPdf); UltimaSaidaImg=$destino }) + Titulo 'Processando' $ok=0;$err=0 foreach ($pf in $pdfs) { - $outDir = Join-Path $pf.DirectoryName ($pf.BaseName + '-imagens') + $outDir = Join-Path $destino ($pf.BaseName + '-imagens') New-Item -ItemType Directory -Path $outDir -Force | Out-Null $padraoSaida = Join-Path $outDir ('pagina-%03d' + $extSaida) Write-Host ''; Write-Host $pf.Name -ForegroundColor Magenta
M Imagens/marca-dagua.cmdImagens/marca-dagua.cmd

@@ -88,7 +88,20 @@ while (-not $posicao) { $e = Read-Host 'Posição (1-5, Enter = 1)'; if ([string]::IsNullOrWhiteSpace($e)) { $e = '1' }; $posicao = $posicoes | Where-Object { $_.Id -eq ($e -as [int]) } | Select-Object -First 1; if (-not $posicao) { Write-Host '[!] Inválido.' -ForegroundColor Yellow } }

$grav = $posicao.Gravity $offset = if ($grav -eq 'Center') { '+0+0' } else { '+25+25' } -Salvar-Config ([pscustomobject]@{ UltimaEntrada=$origem; UltimoTipo=$tipo; UltimoTexto=$texto; UltimoLogo=$logo; UltimaPosicao=$posicao.Id }) +# Pasta de saída (lembra a última; cria se não existir) +$saidaPadrao = if ($config -and $config.UltimaSaida) { $config.UltimaSaida } else { $destino } +while ($true) { + Titulo 'Pasta de saída' + Write-Host " $saidaPadrao" -ForegroundColor White + Write-Host 'Enter = usar esta pasta | ou cole/digite outra' -ForegroundColor DarkGray + $rsaida = Read-Host 'Pasta de saída' + $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') } + try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break } + catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow } +} +$destino = (Resolve-Path -LiteralPath $destino).Path + +Salvar-Config ([pscustomobject]@{ UltimaEntrada=$origem; UltimoTipo=$tipo; UltimoTexto=$texto; UltimoLogo=$logo; UltimaPosicao=$posicao.Id; UltimaSaida=$destino }) # Coleta if ($modoArquivo) { $arquivos = @($arquivoObj) } else {
M Vídeos/criar-gif.cmdVídeos/criar-gif.cmd

@@ -20,6 +20,11 @@ Write-Host " $t" -ForegroundColor Cyan

Write-Host '============================================================' -ForegroundColor DarkCyan } +$configDir = Join-Path $env:APPDATA 'CriarGif' +$configFile = Join-Path $configDir 'config.json' +function Carregar-Config { if (Test-Path -LiteralPath $configFile) { try { return Get-Content -LiteralPath $configFile -Raw -Encoding UTF8 | ConvertFrom-Json } catch {} }; return $null } +function Salvar-Config($o) { try { New-Item -ItemType Directory -Path $configDir -Force | Out-Null; $o | ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8 } catch {} } + $extVideo = @('.mp4','.mkv','.avi','.mov','.wmv','.flv','.webm','.m4v','.mpg','.mpeg','.ts','.3gp','.vob') $extImg = @('.jpg','.jpeg','.png','.webp','.bmp','.tif','.tiff')

@@ -30,6 +35,7 @@ Write-Host 'Verificando o que é necessário...' -ForegroundColor Gray

$ffmpeg = Get-Command ffmpeg -ErrorAction SilentlyContinue if (-not $ffmpeg) { Write-Host ''; Write-Host '[ERRO] FFmpeg não encontrado.' -ForegroundColor Red; Write-Host 'Instale com: winget install Gyan.FFmpeg' -ForegroundColor White; Pausar; exit 1 } Write-Host "[OK] FFmpeg: $($ffmpeg.Source)" -ForegroundColor Green +$config = Carregar-Config Titulo 'O que você quer fazer?' Write-Host ' [1] Vídeo -> GIF' -ForegroundColor White

@@ -56,6 +62,20 @@ if ($modoArquivo) { $arquivoObj = Get-Item -LiteralPath $arquivoUnico; $origem = $arquivoObj.DirectoryName; $videos = @($arquivoObj) }

else { $origem = $entrada; $videos = @(Get-ChildItem -LiteralPath $origem -File | Where-Object { $extVideo -contains $_.Extension.ToLowerInvariant() }) } $destino = Join-Path $origem 'GIF' + # Pasta de saída (lembra a última; cria se não existir) + $saidaPadrao = if ($config -and $config.UltimaSaidaGif) { $config.UltimaSaidaGif } else { $destino } + while ($true) { + Titulo 'Pasta de saída' + Write-Host " $saidaPadrao" -ForegroundColor White + Write-Host 'Enter = usar esta pasta | ou cole/digite outra' -ForegroundColor DarkGray + $rsaida = Read-Host 'Pasta de saída' + $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') } + try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break } + catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow } + } + $destino = (Resolve-Path -LiteralPath $destino).Path + Salvar-Config ([pscustomobject]@{ UltimaSaidaGif=$destino; UltimaSaidaSlide=($config.UltimaSaidaSlide) }) + Titulo 'Processando' Write-Host "Largura: $larg px | FPS: $fps | Destino: $destino" Write-Host "Vídeos: $($videos.Count)" -ForegroundColor Cyan

@@ -98,7 +118,20 @@ $sEnt = Read-Host 'Segundos por foto (Enter = 2)'; $seg = if ($sEnt -as [double]) { [double]$sEnt } else { 2 }

$nome = (Read-Host 'Nome do vídeo de saída (Enter = slideshow.mp4)').Trim() if ([string]::IsNullOrWhiteSpace($nome)) { $nome = 'slideshow.mp4' } if ($nome -notmatch '\.mp4$') { $nome += '.mp4' } -$saida = Join-Path $pasta $nome +# Pasta de saída (lembra a última; cria se não existir) +$saidaPadrao = if ($config -and $config.UltimaSaidaSlide) { $config.UltimaSaidaSlide } else { $pasta } +while ($true) { + Titulo 'Pasta de saída' + Write-Host " $saidaPadrao" -ForegroundColor White + Write-Host 'Enter = usar esta pasta | ou cole/digite outra' -ForegroundColor DarkGray + $rsaida = Read-Host 'Pasta de saída' + $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') } + try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break } + catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow } +} +$destino = (Resolve-Path -LiteralPath $destino).Path +Salvar-Config ([pscustomobject]@{ UltimaSaidaGif=($config.UltimaSaidaGif); UltimaSaidaSlide=$destino }) +$saida = Join-Path $destino $nome # Monta arquivo de lista para o demuxer concat (caminhos com / e aspas) $listaTxt = Join-Path $env:TEMP ("slide_{0}.txt" -f ([guid]::NewGuid().ToString('N')))
M Vídeos/extrair-audio.cmdVídeos/extrair-audio.cmd

@@ -23,7 +23,7 @@

$configDir = Join-Path $env:APPDATA 'ExtrairAudio' $configFile = Join-Path $configDir 'config.json' function Carregar-Config { if (Test-Path -LiteralPath $configFile) { try { return Get-Content -LiteralPath $configFile -Raw -Encoding UTF8 | ConvertFrom-Json } catch {} }; return $null } -function Salvar-Config($e,$f) { try { New-Item -ItemType Directory -Path $configDir -Force | Out-Null; [pscustomobject]@{ UltimaEntrada=$e; UltimoFormato=$f } | ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8 } catch {} } +function Salvar-Config($e,$f,$s) { try { New-Item -ItemType Directory -Path $configDir -Force | Out-Null; [pscustomobject]@{ UltimaEntrada=$e; UltimoFormato=$f; UltimaSaida=$s } | ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8 } catch {} } $extensoes = @('.mp4','.mkv','.avi','.mov','.wmv','.flv','.webm','.m4v','.mpg','.mpeg','.mts','.m2ts','.ts','.3gp','.vob')

@@ -80,7 +80,20 @@ $e = Read-Host 'Formato (1-3)'; if ([string]::IsNullOrWhiteSpace($e)) { $e = "$fmtPadrao" }

$formato = $formatos | Where-Object { $_.Id -eq ($e -as [int]) } | Select-Object -First 1 if (-not $formato) { Write-Host '[!] Inválido.' -ForegroundColor Yellow } } -Salvar-Config $origem $formato.Id +# Pasta de saída (lembra a última; cria se não existir) +$saidaPadrao = if ($config -and $config.UltimaSaida) { $config.UltimaSaida } else { $destino } +while ($true) { + Titulo 'Pasta de saída' + Write-Host " $saidaPadrao" -ForegroundColor White + Write-Host 'Enter = usar esta pasta | ou cole/digite outra' -ForegroundColor DarkGray + $rsaida = Read-Host 'Pasta de saída' + $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') } + try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break } + catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow } +} +$destino = (Resolve-Path -LiteralPath $destino).Path + +Salvar-Config $origem $formato.Id $destino # Coleta if ($modoArquivo) { $arquivos = @($arquivoObj) } else {
M Vídeos/transcodificar.cmdVídeos/transcodificar.cmd

@@ -38,10 +38,10 @@ }

return $null } -function Salvar-Config($pasta, $qualidade) { +function Salvar-Config($pasta, $qualidade, $saida) { try { New-Item -ItemType Directory -Path $configDir -Force | Out-Null - [pscustomobject]@{ UltimaPasta = $pasta; UltimaQualidade = $qualidade } | + [pscustomobject]@{ UltimaPasta = $pasta; UltimaQualidade = $qualidade; UltimaSaida = $saida } | ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8 } catch {} }

@@ -172,7 +172,20 @@ $perfil = $perfis | Where-Object { $_.Id -eq ($escolha -as [int]) } | Select-Object -First 1

if (-not $perfil) { Write-Host '[!] Escolha inválida. Digite um número de 1 a 5.' -ForegroundColor Yellow } } -Salvar-Config $origem $perfil.Id +# Pasta de saída (lembra a última; cria se não existir) +$saidaPadrao = if ($config -and $config.UltimaSaida) { $config.UltimaSaida } else { $destino } +while ($true) { + Titulo 'Pasta de saída' + Write-Host " $saidaPadrao" -ForegroundColor White + Write-Host 'Enter = usar esta pasta | ou cole/digite outra' -ForegroundColor DarkGray + $rsaida = Read-Host 'Pasta de saída' + $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') } + try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break } + catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow } +} +$destino = (Resolve-Path -LiteralPath $destino).Path + +Salvar-Config $origem $perfil.Id $destino # ------------------------------------------------------------ # 4) Coleta dos arquivos de vídeo