TIPS: aprendiendo a usar las IA para generar scripts (tareas programas o automatizadas)

 No necesitar conocer programación, sólo entender conceptos básicos:

-Por un lado, tienes "bucles de repetición" o "circunstancias": que MIENTRAS (WHILE) se esté cumpliendo una condición (p.ej. actualización pendiente), que se ejecute un proceso (cuando se termine o ya NO sea necesario, p.ej. con parches que ya están "reemplazados" por otros mejores)

-Por otros, de "duración" (FOR), que permiten que una tarea se realice "X" número de veces (p.ej. que haga limpieza cada día, 7 veces a la semana o 1 sola vez para desfragmentar, cada viernes, NO a la vez que esté limpiando y NO otro día)

-Por último, tienes el "UNTIL", es decir, algo está en marcha, HASTA que tú lo pares (antivirus, instalación de Windows -con matices, porque si está con un proceso en "instalación" puede suceder que termine al momento y luego tenga que repetirse completo o que primero lo haga y luego se apague)

Puedes pedirle esto concreto:

Genera un script para que, con permisos de administrador (usuario: Alumno, contraseña: alumno), para que instale las actualizaciones llamadas WindowsKB-655.exe hasta la WindowsKB-680.exe

ERROR: te obliga a actualizarlo, si añades otros archivos que NO comiencen por el número 6

En su lugar, pídele esto: Plantéalo para que ejecute una tarea programada con todos los .EXE que estén en c:\updates, cada viernes a las 14:00h

De esta forma, TODOS los .EXE que añadas, serán aplicados/implementados, es más sencillo y puedes solicitar que se haga un día y a una hora concreta, NO cuando el usuario pueda estar usando programas.

De esta forma, puedes encontrarte códigos como este:

# C:\Updates\Install-Updates.ps1

# Ejecuta todos los .EXE de C:\Updates en modo silencioso y guarda log


$UpdatesPath = "C:\Updates"

$LogDir = "C:\Updates\Logs"

New-Item -Path $LogDir -ItemType Directory -Force | Out-Null


$LogFile = Join-Path $LogDir ("install_{0:yyyyMMdd_HHmmss}.log" -f (Get-Date))


"=== Inicio: $(Get-Date) ===" | Out-File -FilePath $LogFile -Encoding UTF8


$exes = Get-ChildItem -Path $UpdatesPath -Filter *.exe -File | Sort-Object Name


if (-not $exes -or $exes.Count -eq 0) {

  "No se encontraron .exe en $UpdatesPath" | Out-File $LogFile -Append -Encoding UTF8

  exit 0

}


foreach ($exe in $exes) {

  "Instalando: $($exe.FullName)" | Out-File $LogFile -Append -Encoding UTF8


  try {

    # Argumentos típicos silenciosos. Si tus EXE usan otros ("/S", "/silent", etc.), te lo adapto.

    $args = "/quiet /norestart"


    $p = Start-Process -FilePath $exe.FullName -ArgumentList $args -Wait -PassThru -WindowStyle Hidden

    "ExitCode: $($p.ExitCode)" | Out-File $LogFile -Append -Encoding UTF8

  }

  catch {

    "ERROR: $($_.Exception.Message)" | Out-File $LogFile -Append -Encoding UTF8

  }

}


"=== Fin: $(Get-Date) ===" | Out-File -FilePath $LogFile -Append -Encoding UTF8

exit 0


Puedes pedirle que te explique, paso a paso, qué está haciendo, para obtener algo como esto:

Explícame, con todo lujo de detalles, pero con palabras sencillas, qué haría este código:  # C:\Updates\Install-Updates.ps1

# Ejecuta todos los .EXE de C:\Updates en modo silencioso y guarda log


$UpdatesPath = "C:\Updates"

$LogDir = "C:\Updates\Logs"

New-Item -Path $LogDir -ItemType Directory -Force | Out-Null


$LogFile = Join-Path $LogDir ("install_{0:yyyyMMdd_HHmmss}.log" -f (Get-Date))


"=== Inicio: $(Get-Date) ===" | Out-File -FilePath $LogFile -Encoding UTF8


$exes = Get-ChildItem -Path $UpdatesPath -Filter *.exe -File | Sort-Object Name


if (-not $exes -or $exes.Count -eq 0) {

  "No se encontraron .exe en $UpdatesPath" | Out-File $LogFile -Append -Encoding UTF8

  exit 0

}


foreach ($exe in $exes) {

  "Instalando: $($exe.FullName)" | Out-File $LogFile -Append -Encoding UTF8


  try {

    # Argumentos típicos silenciosos. Si tus EXE usan otros ("/S", "/silent", etc.), te lo adapto.

    $args = "/quiet /norestart"


    $p = Start-Process -FilePath $exe.FullName -ArgumentList $args -Wait -PassThru -WindowStyle Hidden

    "ExitCode: $($p.ExitCode)" | Out-File $LogFile -Append -Encoding UTF8

  }

  catch {

    "ERROR: $($_.Exception.Message)" | Out-File $LogFile -Append -Encoding UTF8

  }

}


"=== Fin: $(Get-Date) ===" | Out-File -FilePath $LogFile -Append -Encoding UTF8

exit 0


Truco: para que te permita copiar el código correctamente, usa el botón de "copiar" (dos folios) que verás al final de la explicación:











Comentarios

Entradas populares de este blog

Preparación completa de portátil Gaming (Drivers + proceso)

SCRIPT: automatizando chequeos del sistema operativo (Windows 11, CHKDSK, SFC y DISM)

Limpiando y optimizando Windows (Parte 1)