Connect with us
Cómo crear con IA un script de respaldo automático para Windows Cómo crear con IA un script de respaldo automático para Windows

Curiosidades

Cómo crear con IA un script de respaldo automático para Windows

Published

on

Un asistente de inteligencia artificial puede ayudar a escribir y adaptar un script de PowerShell para copiar archivos importantes, registrar errores y enviar notificaciones al celular. Sin embargo, la protección no depende solo del código: también requiere un destino independiente, una programación adecuada y una prueba que confirme que los archivos pueden recuperarse.Esta guía propone un recorrido gradual: primero se realiza una copia de prueba, después se programa su ejecución y, por último, se agregan funciones opcionales de notificación, revisión del almacenamiento y actualización de aplicaciones. El respaldo al apagar se reserva para una configuración avanzada; no debe ser la única oportunidad de proteger los archivos.

Alcance: el ejemplo está escrito para Windows PowerShell 5.1 en Windows 11. No se ha ejecutado en un equipo de prueba durante la elaboración de esta guía. Debe validarse con archivos prescindibles antes de utilizar información importante. No crea una imagen de Windows ni conserva versiones anteriores por sí solo.

¿Qué se necesita antes de empezar?

La configuración inicial requiere una computadora con Windows 11, una carpeta pequeña de origen y un disco externo con espacio disponible. También puede utilizarse una carpeta compartida en un NAS, siempre que la cuenta que ejecutará la tarea tenga acceso de escritura.

El destino debe estar en otro dispositivo físico. Otra carpeta o partición del mismo disco no protege frente a la falla de esa unidad. El disco externo debe permanecer conectado cuando se ejecute la tarea; el NAS debe estar encendido y accesible.

Windows PowerShell 5.1, Robocopy y el Programador de tareas vienen incluidos en Windows 11. PowerShell 7 es una instalación independiente y no es necesario para seguir este procedimiento.

Advertisement

El asistente de IA es opcional para utilizar el ejemplo, pero resulta útil para explicar el código o adaptarlo. No deben compartirse contraseñas, tokens, documentos privados ni bitácoras sin revisar. Tampoco conviene ejecutar código generado con privilegios de administrador si la tarea no los necesita.

¿Qué protege esta copia y qué no?

El script utiliza Robocopy con /E para copiar archivos y subcarpetas, incluidas las vacías, sin purgar los archivos que solo existan en el destino. Cuando un archivo del origen cambia, su copia anterior puede sobrescribirse.

Una copia actualizada no equivale a un respaldo con historial. Si un documento se corrompe o un programa malicioso cifra los archivos, una ejecución posterior puede copiar esos cambios al destino. Por ello, conviene complementarla con versiones, instantáneas del NAS o una herramienta de respaldo con retención.

El ejemplo no utiliza /MIR. Ese parámetro crea un espejo y puede eliminar del destino los archivos que ya no existen en el origen, incluidos los borrados por accidente. Puede consultarse su comportamiento en la documentación de Robocopy.

También debe existir otra copia independiente, preferentemente con aislamiento o conservación de versiones. Un dispositivo conectado permanentemente puede quedar expuesto a borrados o software malicioso.

Advertisement

¿Cómo preparar una prueba sin arriesgar documentos?

El primer ensayo debe realizarse con archivos que puedan perderse. Desde el menú Inicio se abre Windows PowerShell, sin seleccionar la opción de administrador, y se ejecuta:

$base = Join-Path $env:USERPROFILE 'ScriptsRespaldo'
$prueba = Join-Path $env:USERPROFILE 'PruebaRespaldo'

New-Item -ItemType Directory -Path $base -Force | Out-Null
New-Item -ItemType Directory -Path $prueba -Force | Out-Null

'Primer documento de prueba' |
    Set-Content -LiteralPath (Join-Path $prueba 'documento1.txt') -Encoding UTF8

'Segundo documento de prueba' |
    Set-Content -LiteralPath (Join-Path $prueba 'documento2.txt') -Encoding UTF8

explorer.exe $base

Se crearán dos carpetas dentro del perfil del usuario: ScriptsRespaldo, que contendrá el script y sus registros, y PruebaRespaldo, con dos documentos de texto.

Antes de continuar debe identificarse la letra del disco externo en el Explorador de archivos. Los ejemplos siguientes utilizan E:, pero debe sustituirse por la letra real. No debe elegirse una unidad por su letra sin comprobar qué dispositivo es.

¿Cómo preparar el destino?

En el disco externo se crea una carpeta exclusiva para la prueba. Dentro se añade un archivo marcador que el script exigirá antes de copiar. Así se reduce el riesgo de escribir en una ubicación distinta si cambia la letra de la unidad.

# Sustituir E: por la unidad externa correcta.
$destino = 'E:\RespaldoPrueba'

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

'Destino autorizado para este respaldo' |
    Set-Content -LiteralPath (Join-Path $destino '.destino-respaldo') -Encoding UTF8

El archivo .destino-respaldo no es una contraseña ni una protección contra ataques: es una comprobación adicional para evitar errores de configuración. No debe copiarse a otras carpetas sin revisar su propósito.

Advertisement

Para un NAS, el destino puede ser \\MI-NAS\Respaldo\Prueba. La carpeta y el marcador deben crearse desde la cuenta que después ejecutará la tarea. Una ruta UNC identifica el recurso, pero no resuelve por sí sola los permisos ni la autenticación.

¿Cómo guardar el script?

En el Explorador de archivos se activa la visualización de extensiones desde Ver > Mostrar > Extensiones de nombre de archivo. Después se abre el Bloc de notas, se pega el siguiente código y se guarda dentro de ScriptsRespaldo con el nombre respaldo.ps1, seleccionando Todos los archivos como tipo.

Debe comprobarse que el archivo no se llame respaldo.ps1.txt. El código utiliza mensajes sin acentos para reducir problemas de codificación con Windows PowerShell 5.1.

El script exige rutas explícitas, comprueba el marcador del destino, impide copias simultáneas desde esta instalación y limita el tiempo de ejecución de Robocopy. Las notificaciones están desactivadas hasta que se indiquen sus parámetros.

param(
    [Parameter(Mandatory = $true)]
    [string]$Origen,

    [Parameter(Mandatory = $true)]
    [string]$Destino,

    [ValidateRange(1, 1440)]
    [int]$MaxMinutos = 30,

    [switch]$Simular,

    [string]$NtfyUrl,

    [string]$NtfyCredencial
)

$ErrorActionPreference = 'Stop'
$carpetaLogs = Join-Path $PSScriptRoot 'logs'
$archivoBloqueo = Join-Path $PSScriptRoot 'respaldo.lock'

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

$id = (Get-Date -Format 'yyyyMMdd-HHmmss') + '-' + $PID
$log = Join-Path $carpetaLogs ("ejecucion-" + $id + ".log")
$logCopia = Join-Path $carpetaLogs ("robocopy-" + $id + ".log")

$bloqueo = $null
$proceso = $null
$salida = 1
$estado = 'ERROR'
$inicio = Get-Date

function Escribir-Log {
    param([string]$Texto)

    $linea = '{0} {1}' -f (Get-Date -Format 's'), $Texto
    Add-Content -LiteralPath $log -Value $linea -Encoding UTF8
    Write-Host $linea
}

function Obtener-RutaNormalizada {
    param([string]$Ruta)

    if (-not [System.IO.Path]::IsPathRooted($Ruta)) {
        throw 'Se requieren rutas absolutas.'
    }

    # Aceptar unidades locales o rutas UNC, no rutas relativas a una unidad.
    if ($Ruta -notmatch '^[A-Za-z]:[\\/]' -and
        $Ruta -notmatch '^\\\\[^\\]+\\[^\\]+') {
        throw 'La ruta debe ser absoluta: C:\Carpeta o \\Servidor\Recurso\Carpeta.'
    }

    $completa = [System.IO.Path]::GetFullPath($Ruta)
    return $completa.TrimEnd([char[]]'\/')
}

try {
    try {
        $bloqueo = [System.IO.File]::Open(
            $archivoBloqueo,
            [System.IO.FileMode]::OpenOrCreate,
            [System.IO.FileAccess]::ReadWrite,
            [System.IO.FileShare]::None
        )
    }
    catch {
        throw 'No se pudo obtener el bloqueo. Puede haber otra copia activa o faltar permisos.'
    }

    $identidad = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
    Escribir-Log "Inicio. Cuenta: $identidad"

    $origenReal = Obtener-RutaNormalizada $Origen
    $destinoReal = Obtener-RutaNormalizada $Destino

    $raizOrigen = ([System.IO.Path]::GetPathRoot($origenReal)).TrimEnd([char[]]'\/')
    $raizDestino = ([System.IO.Path]::GetPathRoot($destinoReal)).TrimEnd([char[]]'\/')

    if ($origenReal -ieq $raizOrigen -or $destinoReal -ieq $raizDestino) {
        throw 'No se permite utilizar la raiz de una unidad o recurso compartido.'
    }

    $comparacion = [System.StringComparison]::OrdinalIgnoreCase

    if ($origenReal -ieq $destinoReal -or
        $destinoReal.StartsWith($origenReal + '\', $comparacion) -or
        $origenReal.StartsWith($destinoReal + '\', $comparacion)) {
        throw 'Origen y destino deben ser carpetas distintas y no estar contenidos entre si.'
    }

    if (-not (Test-Path -LiteralPath $origenReal -PathType Container)) {
        throw 'El origen no existe o no esta disponible.'
    }

    if (-not (Test-Path -LiteralPath $destinoReal -PathType Container)) {
        throw 'El destino no existe o no esta disponible.'
    }

    foreach ($ruta in @($origenReal, $destinoReal)) {
        $elemento = Get-Item -LiteralPath $ruta -Force
        if (($elemento.Attributes -band [System.IO.FileAttributes]::ReparsePoint) -ne 0) {
            throw 'La carpeta seleccionada es un punto de reanalisis. Debe revisarse antes de usarla.'
        }
    }

    $marcador = Join-Path $destinoReal '.destino-respaldo'

    if (-not (Test-Path -LiteralPath $marcador -PathType Leaf)) {
        throw 'Falta el archivo .destino-respaldo en el destino.'
    }

    Escribir-Log "Origen: $origenReal"
    Escribir-Log "Destino: $destinoReal"
    Escribir-Log "Bitacora de copia: $logCopia"

    # /XJ excluye puntos de union.
    # /XA:SL excluye archivos con atributos System u Offline.
    # Los enlaces simbolicos y otros casos especiales requieren revision.
    $argumentos = '"{0}" "{1}" /E /Z /R:3 /W:5 /XJ /XA:SL /NP /UNILOG:"{2}"' -f `
        $origenReal, $destinoReal, $logCopia

    if ($Simular) {
        $argumentos += ' /L'
        Escribir-Log 'Modo simulacion: no se copiaran archivos.'
    }

    $robocopy = Join-Path $env:SystemRoot 'System32\robocopy.exe'

    $proceso = Start-Process -FilePath $robocopy `
        -ArgumentList $argumentos `
        -PassThru -NoNewWindow

    $termino = $proceso.WaitForExit($MaxMinutos * 60 * 1000)

    if (-not $termino) {
        try {
            if (-not $proceso.HasExited) {
                $proceso.Kill()
                [void]$proceso.WaitForExit(5000)
            }
        }
        catch {
            Escribir-Log ("No se pudo confirmar la detencion: " + $_.Exception.Message)
        }

        throw 'Tiempo agotado. La copia debe considerarse incompleta.'
    }

    $codigo = $proceso.ExitCode
    Escribir-Log "Codigo de Robocopy: $codigo"

    if ($codigo -ge 8) {
        throw "Robocopy informo al menos un fallo. Codigo: $codigo"
    }

    if ($Simular) {
        $estado = 'SIMULACION'
    }
    elseif ($codigo -ge 2) {
        $estado = 'REVISAR'
    }
    else {
        $estado = 'CORRECTO'
    }

    # 0: sin fallos de copia. El detalle permanece en las bitacoras.
    $salida = 0
    Escribir-Log "Resultado: $estado"
}
catch {
    $estado = 'ERROR'
    $salida = 1
    Escribir-Log ("Error: " + $_.Exception.Message)
}
finally {
    $duracion = [math]::Round(((Get-Date) - $inicio).TotalSeconds, 1)
    Escribir-Log "Duracion: $duracion segundos"

    if ($NtfyUrl) {
        try {
            $uri = [uri]$NtfyUrl

            if (-not $uri.IsAbsoluteUri -or $uri.Scheme -ne 'https') {
                throw 'La direccion de ntfy debe utilizar HTTPS.'
            }

            if (-not $NtfyCredencial) {
                throw 'Falta la ruta del archivo de credencial de ntfy.'
            }

            $credencial = Import-Clixml -LiteralPath $NtfyCredencial

            if ($credencial -isnot [System.Management.Automation.PSCredential]) {
                throw 'El archivo no contiene una credencial compatible.'
            }

            $token = $credencial.GetNetworkCredential().Password
            $cabeceras = @{ Authorization = "Bearer $token" }
            $mensaje = "Respaldo: $estado. Duracion: $duracion segundos."

            Invoke-RestMethod -Method Post -Uri $uri.AbsoluteUri `
                -Headers $cabeceras `
                -ContentType 'text/plain; charset=utf-8' `
                -Body ([System.Text.Encoding]::UTF8.GetBytes($mensaje)) `
                -TimeoutSec 10 -ErrorAction Stop | Out-Null

            Escribir-Log 'Notificacion enviada.'
        }
        catch {
            Escribir-Log ("Fallo de notificacion: " + $_.Exception.Message)
        }
        finally {
            $token = $null
            $credencial = $null
            $cabeceras = $null
        }
    }

    if ($null -ne $bloqueo) {
        $bloqueo.Dispose()
    }
}

exit $salida

Precauciones del ejemplo: el límite de tiempo corresponde al proceso de Robocopy, no a todas las operaciones previas de acceso a la red. Una comprobación de una ruta desconectada puede tardar por los tiempos de espera de Windows. Por eso este script no se presenta como una solución que garantice un apagado sin esperas.

Advertisement

El ejemplo omite archivos con los atributos System u Offline mediante /XA:SL. Esta decisión reduce algunos problemas en una copia introductoria, pero también puede excluir información que el lector necesite. Debe revisarse la selección en la simulación. Para carpetas con archivos de nube, enlaces, bases de datos o contenido especial, se requiere una adaptación específica.

La comprobación de rutas tampoco determina si dos letras de unidad, recursos de red o rutas alternativas corresponden al mismo almacenamiento. Esa separación debe confirmarse antes de ejecutar la copia.

¿Cómo ejecutar la simulación?

En la misma ventana de Windows PowerShell se ejecuta el siguiente comando, sustituyendo la unidad del destino cuando corresponda:

& "$env:USERPROFILE\ScriptsRespaldo\respaldo.ps1" `
    -Origen "$env:USERPROFILE\PruebaRespaldo" `
    -Destino "E:\RespaldoPrueba" `
    -Simular

El resultado debe indicar SIMULACION. Dentro de ScriptsRespaldo\logs aparecerán dos registros: uno con el estado general y otro con el detalle de Robocopy.

La simulación utiliza /L: enumera las operaciones previstas, pero no copia los documentos. Sí crea registros locales y el archivo de bloqueo. Tampoco demuestra que la cuenta tenga permiso para escribir archivos en el destino; eso se comprobará con la copia real.

Advertisement

Si Windows bloquea la ejecución del archivo, puede revisarse la configuración con:

Get-ExecutionPolicy -List

En una computadora personal no administrada, y después de revisar el código, puede habilitarse la ejecución de scripts locales para la cuenta actual mediante:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

Este cambio no debe realizarse sin autorización en un equipo de trabajo. Si una directiva de la organización controla la ejecución, debe consultarse con su administrador. No es necesario utilizar Unrestricted ni desactivar globalmente las restricciones.

¿Cómo comprobar la primera copia real?

Después de revisar las rutas y la simulación, se repite el comando sin -Simular:

& "$env:USERPROFILE\ScriptsRespaldo\respaldo.ps1" `
    -Origen "$env:USERPROFILE\PruebaRespaldo" `
    -Destino "E:\RespaldoPrueba"

$LASTEXITCODE

Los dos documentos deben aparecer en E:\RespaldoPrueba. El script devuelve 0 cuando Robocopy termina sin fallos de copia y 1 si detecta un error o una interrupción. El resultado detallado queda en la bitácora.

Advertisement

Robocopy tiene sus propios códigos: un valor distinto de cero no siempre representa una falla. Los valores iguales o superiores a 8 indican al menos un fallo; otros pueden describir archivos adicionales o diferencias. Por eso el script conserva el código original y utiliza REVISAR cuando corresponde. El marcador del destino puede aparecer como un archivo adicional y producir ese estado sin que exista un fallo de transferencia.

La prueba debe continuar con cuatro situaciones:

  1. Ejecutar una segunda copia sin modificar documentos y comprobar que no se vuelvan a transferir innecesariamente.
  2. Modificar documento1.txt, repetir la copia y confirmar que el destino contiene la nueva versión.
  3. Eliminar documento2.txt del origen, repetir la copia y comprobar que permanece en el destino.
  4. Desconectar correctamente el disco externo cuando no haya una copia activa, ejecutar otra vez y verificar que se registra un error de destino no disponible.

Estas pruebas muestran tanto la utilidad como la limitación del método: no propaga automáticamente los borrados, pero sí puede reemplazar versiones anteriores.

¿Cómo recuperar un archivo antes de automatizar?

La recuperación debe ensayarse hacia una carpeta distinta para evitar sobrescribir el origen:

$recuperacion = Join-Path $env:USERPROFILE 'RecuperacionPrueba'
New-Item -ItemType Directory -Path $recuperacion -Force | Out-Null

Copy-Item -LiteralPath 'E:\RespaldoPrueba\documento1.txt' `
    -Destination $recuperacion

notepad.exe (Join-Path $recuperacion 'documento1.txt')

El documento recuperado debe abrirse y mostrar el contenido esperado. Si el original no cambia durante la comprobación, también pueden compararse sus hashes:

Get-FileHash -LiteralPath "$env:USERPROFILE\PruebaRespaldo\documento1.txt"
Get-FileHash -LiteralPath "$env:USERPROFILE\RecuperacionPrueba\documento1.txt"

Ambos valores deben coincidir. Esta prueba comprueba ese archivo concreto, no toda la integridad del respaldo ni su capacidad para conservar versiones históricas.

Advertisement

¿Cómo cambiar de los archivos de prueba a una carpeta real?

Una vez completada la recuperación, se selecciona una carpeta pequeña de información importante. En el Explorador de archivos puede utilizarse Copiar como ruta para obtener su ubicación real. No deben suponerse las rutas de Documentos o Imágenes, porque pueden estar redirigidas a OneDrive u otro destino.

En el disco externo se crea una nueva carpeta exclusiva, por ejemplo E:\RespaldoDocumentos, y se añade su marcador:

$destino = 'E:\RespaldoDocumentos'

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

'Destino autorizado para documentos' |
    Set-Content -LiteralPath (Join-Path $destino '.destino-respaldo') -Encoding UTF8

Después se repite la simulación con las rutas definitivas. Debe revisarse qué archivos se incluyen y cuáles quedan fuera. Los documentos necesarios de servicios en la nube deben estar descargados y disponibles sin conexión.

La primera copia real debe medirse antes de fijar el límite de duración. Treinta minutos es solo un valor inicial: una colección grande puede necesitar mucho más tiempo. Los archivos abiertos o que cambien durante la transferencia pueden fallar o no formar una copia coherente; bases de datos y aplicaciones similares necesitan métodos específicos de respaldo.

¿Cómo pedirle a la IA que adapte el script?

La IA puede explicar cada función, incorporar exclusiones o ajustar el comportamiento. La solicitud debe mantener condiciones verificables y no limitarse a “mejorar el código”. Un prompt útil sería:

Advertisement
Revisa este script para Windows PowerShell 5.1.

Se ejecutara con mi cuenta de usuario, durante una sesion abierta.
Origen: [ruta de la carpeta].
Destino: [disco externo o ruta UNC].
Duracion observada de la primera copia: [minutos].

Necesito:
- No eliminar archivos del destino.
- Mantener la simulacion antes de cualquier cambio.
- Explicar las exclusiones y los atributos que omiten archivos.
- Registrar errores sin contrasenas ni tokens.
- Conservar la comprobacion del destino y el bloqueo de concurrencia.
- Distinguir una copia incompleta de una copia terminada.
- No solicitar privilegios de administrador si no son necesarios.

Antes de modificarlo, identifica riesgos y datos faltantes.
Entrega el archivo completo y una lista de pruebas.
No afirmes que esta probado si no lo ejecutaste.

La misma metodología sirve para otras tareas: definir el objetivo, limitar permisos y comprobar resultados. Los trucos de Gemini CLI para automatizar una PC con Windows ofrecen una lectura complementaria. Esta guía no requiere instalar Gemini CLI ni utilizar un asistente específico.

¿Cómo programar el respaldo automático?

El Programador de tareas de Windows permite ejecutar la copia sin abrir PowerShell manualmente. Para comenzar, la tarea debe utilizar la misma cuenta con la que se realizaron las pruebas y ejecutarse solo cuando esa sesión esté abierta.

  1. Buscar Programador de tareas en Inicio y abrirlo.
  2. Seleccionar Crear tarea, no “Crear tarea básica”.
  3. Asignar un nombre identificable, como Respaldo de documentos.
  4. En General, seleccionar la cuenta utilizada en las pruebas y Ejecutar solo cuando el usuario haya iniciado sesión. No activar privilegios elevados para esta configuración inicial.
  5. En Desencadenadores, crear uno de tipo Al iniciar sesión para esa cuenta y añadir un retraso de dos minutos.
  6. Si se necesitan copias durante el día, añadir otro desencadenador diario con repetición cada cuatro horas durante un día. Es una frecuencia de ejemplo, no una recomendación universal.
  7. En Acciones, elegir Iniciar un programa y completar los campos indicados debajo.
  8. En Configuración, habilitar la ejecución cuanto antes si se omitió un inicio programado y elegir No iniciar una nueva instancia cuando la tarea ya esté activa.
  9. Revisar las condiciones de energía. Si la tarea no puede ejecutarse con batería, el respaldo quedará pospuesto hasta que se cumplan las condiciones.
  10. Guardar la tarea y ejecutarla manualmente desde su menú contextual.

Programa o script:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

Argumentos: deben sustituirse TuUsuario, el origen y el destino por las rutas definitivas. La carpeta de origen no tiene que ser todo Documentos; puede ser una subcarpeta.

-NoProfile -NonInteractive -File "C:\Users\TuUsuario\ScriptsRespaldo\respaldo.ps1" -Origen "C:\Users\TuUsuario\Documents\Importantes" -Destino "E:\RespaldoDocumentos" -MaxMinutos 30

Iniciar en:

C:\Users\TuUsuario\ScriptsRespaldo

No debe activarse todavía la tarea sobre información real si la prueba manual con esas mismas rutas no ha terminado correctamente. Después de seleccionar Ejecutar, deben comprobarse los archivos del destino y las dos bitácoras, no solo el campo “Último resultado de ejecución”.

Advertisement

Puede establecerse en el Programador un límite adicional mayor que el del script, por ejemplo 45 minutos si Robocopy dispone de 30. Es una protección secundaria: una detención externa puede impedir que se escriba el cierre del registro o se envíe la notificación. Si falta ese cierre, la ejecución debe revisarse.

Para trabajar sin una sesión abierta se necesita otra configuración de inicio de sesión y una nueva validación del acceso al destino. Esa ampliación no debe darse por equivalente a la configuración inicial.

¿Cómo recibir alertas en el celular con ntfy?

Las notificaciones son opcionales. Primero debe comprobarse el respaldo sin ellas; después se instala la aplicación de ntfy en el celular y se configura la suscripción al servidor y al tema elegidos.

Un tema público no es un canal privado. Un nombre difícil de adivinar no sustituye al control de acceso. Para este ejemplo debe utilizarse un tema protegido, configurado para impedir lecturas y publicaciones no autorizadas, y un token de una cuenta con los permisos necesarios. Añadir un token a una petición no vuelve privado un tema que continúa abierto.

La disponibilidad de temas protegidos depende del servidor y del plan o configuración utilizados. La documentación de publicación y autenticación de ntfy explica las opciones.

Advertisement

El script puede recuperar el token desde una credencial exportada por Windows. En la misma cuenta y computadora que ejecutarán la tarea, se utiliza:

$archivoCredencial = Join-Path $env:USERPROFILE 'ScriptsRespaldo\ntfy.credential.xml'

Get-Credential -UserName 'ntfy-token' `
    -Message 'Introducir el token de ntfy en el campo de contrasena' |
    Export-Clixml -LiteralPath $archivoCredencial

En el campo de contraseña se introduce el token, no la contraseña de Windows. En Windows, la contraseña exportada de esta forma queda protegida mediante DPAPI y su recuperación está vinculada a la cuenta y al equipo. El archivo no debe publicarse ni compartirse; tampoco protege frente a código malicioso que ya se ejecute como ese usuario.

Para comprobar la integración se realiza otra simulación, sustituyendo la dirección por la del tema protegido:

& "$env:USERPROFILE\ScriptsRespaldo\respaldo.ps1" `
    -Origen "$env:USERPROFILE\PruebaRespaldo" `
    -Destino "E:\RespaldoPrueba" `
    -Simular `
    -NtfyUrl "https://SERVIDOR-NTFY/TEMA-PROTEGIDO" `
    -NtfyCredencial "$env:USERPROFILE\ScriptsRespaldo\ntfy.credential.xml"

El aviso debe indicar que fue una simulación. Una vez confirmado, pueden añadirse ambos parámetros a los argumentos de la tarea programada, utilizando rutas completas.

Las alertas solo contienen estado y duración. No incluyen nombres de documentos ni rutas. Si el envío falla, el error queda en la bitácora sin cambiar el resultado de la copia. La ausencia de una notificación nunca debe interpretarse como éxito.

Advertisement

¿Cómo revisar el almacenamiento?

La revisión básica puede realizarse de forma independiente con estos comandos:

Get-PSDrive -PSProvider FileSystem |
    Select-Object Name, Root, Used, Free

Get-PhysicalDisk |
    Select-Object FriendlyName, MediaType, HealthStatus, OperationalStatus

El primero muestra el espacio reportado para las unidades disponibles en esa sesión. El segundo muestra información proporcionada por la plataforma de almacenamiento. Algunos controladores, dispositivos USB, sistemas RAID o entornos virtualizados pueden entregar datos limitados.

No es un diagnóstico completo ni una garantía de que un disco no fallará. Tampoco examina los discos internos de un NAS a través de su carpeta compartida. Para ello deben utilizarse sus herramientas de administración y, cuando corresponda, las del fabricante.

Si se desea conservar el resultado, puede guardarse en un archivo independiente:

$informe = Join-Path $env:USERPROFILE 'ScriptsRespaldo\logs\almacenamiento.txt'

& {
    Get-Date
    Get-PSDrive -PSProvider FileSystem |
        Select-Object Name, Root, Used, Free

    Get-PhysicalDisk |
        Select-Object FriendlyName, MediaType, HealthStatus, OperationalStatus
} | Out-File -LiteralPath $informe -Encoding UTF8

Esta función debe automatizarse solo después de probarla y mantenerse separada de la copia, para que una consulta de almacenamiento fallida no impida el respaldo.

Advertisement

¿Cómo añadir actualizaciones de aplicaciones?

Las actualizaciones deben tener su propia tarea y sus propios registros. Primero se comprueba que WinGet esté disponible y qué aplicaciones reconoce:

winget --version
winget list
winget upgrade

El último comando muestra las actualizaciones detectadas; no actualiza todo por sí solo. Después puede probarse una aplicación concreta mediante su identificador exacto. Este ejemplo corresponde a VLC:

winget upgrade --id VideoLAN.VLC --exact --source winget --silent --disable-interactivity

Antes de automatizar, deben revisarse los acuerdos del origen y del paquete. WinGet dispone de parámetros para aceptarlos expresamente, pero no deben añadirse sin comprender su efecto. Algunas aplicaciones requieren elevación, pueden estar abiertas o no admiten un comportamiento completamente desatendido. Las limitaciones se describen en la documentación de actualización de WinGet.

Para ampliar el proyecto, puede pedirse a la IA un segundo script que actualice únicamente una lista permitida, registre cada resultado y deje como pendientes las aplicaciones que requieren intervención. No debe cerrar programas, autorizar reinicios ni utilizar --all sin una decisión expresa.

WinGet no sustituye a Windows Update y no garantiza cubrir todas las aplicaciones. Además, winget.exe no está admitido en el contexto Local System, por lo que no debe colocarse en el script de apagado. La restricción aparece en la documentación de solución de problemas de WinGet.

Advertisement

¿Conviene respaldar antes de apagar?

Una copia al apagar puede ser un complemento, pero complica una guía introductoria: puede retrasar el cierre, ejecutarse sin las credenciales habituales y quedar incompleta si el sistema agota su tiempo de espera. Tampoco protege frente a un corte eléctrico o un apagado forzado.

En Windows Pro, Enterprise o Education puede configurarse mediante gpedit.msc, dentro de Configuración del equipo > Configuración de Windows > Scripts (inicio o apagado) > Apagar. Windows Home no incluye ese editor de forma predeterminada.

Los scripts de apagado se ejecutan como Local System, no como el usuario conectado. No debe suponerse que tendrán acceso al NAS, a unidades asignadas durante la sesión o al token exportado con la cuenta del usuario. Puede consultarse el contexto de ejecución en la documentación de scripts de directiva local.

El script de esta guía no debe registrarse directamente como script de apagado. Esa variante necesita una revisión específica de credenciales, permisos, ubicación protegida, tiempos de espera y bloqueo entre identidades. Para la mayoría de los lectores, resulta más sencillo conservar las copias durante la sesión y verificar su recuperación.

¿Cómo resolver los errores más comunes?

El script no aparece o no se ejecuta

Debe comprobarse que el archivo termine en .ps1, que la ruta sea correcta y que la política de ejecución permita utilizarlo. Si funciona manualmente, pero no como tarea, deben compararse la cuenta, los argumentos y el directorio de trabajo.

Advertisement

El destino no está disponible

Debe revisarse la conexión del disco, su letra y la existencia del marcador. En un NAS también deben comprobarse la conexión de red, el servidor, el recurso compartido y los permisos. El script no crea automáticamente un destino inexistente para evitar copiar en una ubicación equivocada.

Aparece acceso denegado

El error 5 corresponde a acceso denegado. Deben revisarse los permisos del origen y del destino para la cuenta real de ejecución. En una carpeta compartida pueden intervenir tanto los permisos del recurso como los del sistema de archivos.

No se encuentra el nombre o la ruta de red

El error 67 indica que no se encuentra el nombre de red; el 53, que no se encuentra la ruta de red. No deben confundirse con un problema genérico de permisos. El comando net view \\MI-NAS puede ayudar a enumerar recursos si el dispositivo lo permite, pero su fallo no demuestra por sí solo que la carpeta no exista. Los significados se encuentran en los códigos de error de Windows.

El respaldo queda incompleto

Debe revisarse si se agotó el tiempo, se desconectó el destino, faltó espacio o hubo archivos bloqueados. El parámetro /Z permite reanudar transferencias compatibles en una ejecución posterior, pero una copia interrumpida no debe darse por válida hasta completar otra ejecución y comprobar sus registros.

Se informa que existe otra copia activa

El archivo de bloqueo puede permanecer en la carpeta después de terminar: eso es normal. Lo que impide una segunda ejecución es que otro proceso mantenga el archivo abierto de forma exclusiva. No debe borrarse para intentar saltarse esa protección; primero debe comprobarse si existe una copia en curso.

Advertisement

La bitácora no permite entender el problema

Debe conservarse el mensaje exacto, el momento de ejecución y la cuenta utilizada. Para profundizar, analizar los logs de Windows 11 con IA puede ayudar a interpretar los registros. Antes de compartirlos deben eliminarse datos personales, rutas sensibles y secretos.

¿Cómo detener o retirar la automatización?

Para impedir nuevas ejecuciones se abre el Programador de tareas, se localiza Respaldo de documentos y se selecciona Deshabilitar. Esto no equivale a cancelar una copia que ya esté activa.

Si es necesario detenerla, debe asumirse que la transferencia puede quedar incompleta. Después habrá que ejecutar otra copia y revisar los registros. No debe desconectarse el disco mientras exista actividad de escritura.

Para retirar el sistema se elimina primero la tarea y después, cuando ya no haya procesos activos, se decide qué hacer con el script, las credenciales y las bitácoras. Los archivos respaldados no deben borrarse como parte de esa limpieza sin una decisión independiente.

¿Cuándo puede considerarse listo?

La automatización está preparada para uso cotidiano cuando completa una copia real, permite recuperar documentos, registra un destino desconectado y evita ejecuciones simultáneas. También debe haberse comprobado qué archivos quedan excluidos y cuánto tarda la primera transferencia.

Advertisement

Durante las primeras semanas conviene revisar las bitácoras y la fecha de la última ejecución terminada sin fallos. Los registros se acumulan y este ejemplo no los elimina automáticamente; su retención debe definirse después, conservando información suficiente para diagnosticar problemas.

Las pruebas de recuperación deben repetirse periódicamente y después de cambiar rutas, permisos, dispositivos o código. Las notificaciones ayudan a supervisar, pero no sustituyen esa comprobación.

El respaldo no se valida porque el script termine, sino porque los archivos pueden recuperarse. La IA facilita la escritura y la adaptación; la confiabilidad depende de las pruebas, las versiones conservadas y la independencia de las copias.

Lo más leído en Curiosidades

  1. Retratos de mascotas con ChatGPT Images para el Día de Muertos
    ChatGPT

    Retratos de mascotas con ChatGPT Images para el Día de Muertos

    · 3 min · 473 vistas

    Las mascotas también forman parte de las historias que se recuerdan durante el Día de Muertos: con ChatGPT…

  2. Cómo crear con IA un script de respaldo automático para Windows
    Curiosidades

    Cómo crear con IA un script de respaldo automático para Windows

    · 22 min · 207 vistas

    Un asistente de inteligencia artificial puede ayudar a escribir y adaptar un script de PowerShell para copiar archivos…

ChatGPT

Retratos de mascotas con ChatGPT Images para el Día de Muertos

Published

on

Retratos de mascotas con ChatGPT Images para el Día de Muertos

Las mascotas también forman parte de las historias que se recuerdan durante el Día de Muertos: con ChatGPT Images es posible transformar una fotografía guardada en el celular o en un álbum en un retrato conmemorativo que celebre su vida y ocupe un lugar especial en la ofrenda.

(más…)

Lo más leído en Curiosidades

  1. Retratos de mascotas con ChatGPT Images para el Día de Muertos
    ChatGPT

    Retratos de mascotas con ChatGPT Images para el Día de Muertos

    · 3 min · 473 vistas

    Las mascotas también forman parte de las historias que se recuerdan durante el Día de Muertos: con ChatGPT…

  2. Cómo crear con IA un script de respaldo automático para Windows
    Curiosidades

    Cómo crear con IA un script de respaldo automático para Windows

    · 22 min · 207 vistas

    Un asistente de inteligencia artificial puede ayudar a escribir y adaptar un script de PowerShell para copiar archivos…

Continue Reading

Curiosidades

Oh-my-hermes guía completa para orquestar el agente Hermes con modelos en paralelo

Published

on

Oh-my-hermes guía completa para orquestar el agente Hermes con modelos en paralelo

Oh-my-hermes, o OMH, es una capa de operación de código abierto para Hermes Agent que convierte objetivos amplios en flujos de trabajo verificables. En vez de tratar una petición como una sola conversación con un único modelo, la descompone en tareas pequeñas, decide qué modelo y qué nivel de razonamiento convienen en cada tramo, ejecuta trabajo en paralelo cuando no hay conflicto de escritura y separa con claridad lo planeado, lo ejecutado y lo verificado.

(más…)

Lo más leído en Curiosidades

  1. Retratos de mascotas con ChatGPT Images para el Día de Muertos
    ChatGPT

    Retratos de mascotas con ChatGPT Images para el Día de Muertos

    · 3 min · 473 vistas

    Las mascotas también forman parte de las historias que se recuerdan durante el Día de Muertos: con ChatGPT…

  2. Cómo crear con IA un script de respaldo automático para Windows
    Curiosidades

    Cómo crear con IA un script de respaldo automático para Windows

    · 22 min · 207 vistas

    Un asistente de inteligencia artificial puede ayudar a escribir y adaptar un script de PowerShell para copiar archivos…

Continue Reading

Curiosidades

Tareas personales en el trabajo: la nueva jornada laboral que ya es realidad

Published

on

Tareas personales en el trabajo: la nueva jornada laboral que ya es realidad

Casi 6 de cada 10 profesionales europeos realizan tareas personales durante su jornada laboral varias veces a la semana, según una encuesta de LiveCareer a 1.000 trabajadores de Alemania, España, Francia e Italia. El 72% afirma que esos descansos breves lo hacen más productivo, no menos.

(más…)

Lo más leído en Curiosidades

  1. Retratos de mascotas con ChatGPT Images para el Día de Muertos
    ChatGPT

    Retratos de mascotas con ChatGPT Images para el Día de Muertos

    · 3 min · 473 vistas

    Las mascotas también forman parte de las historias que se recuerdan durante el Día de Muertos: con ChatGPT…

  2. Cómo crear con IA un script de respaldo automático para Windows
    Curiosidades

    Cómo crear con IA un script de respaldo automático para Windows

    · 22 min · 207 vistas

    Un asistente de inteligencia artificial puede ayudar a escribir y adaptar un script de PowerShell para copiar archivos…

Continue Reading

Lo más reciente

Lo más popular

Subscribete a nuestro Podcast

Trending