Ejecución de scripts con el marco de compatibilidad de paquete

Los scripts permiten a los profesionales de TI personalizar una aplicación dinámicamente en el entorno del usuario después de empaquetarla mediante MSIX. Por ejemplo, puedes usar scripts para configurar la base de datos, configurar una VPN, montar una unidad compartida o realizar una comprobación de licencia dinámicamente. Los scripts proporcionan mucha flexibilidad. Pueden cambiar las claves del Registro o realizar modificaciones de archivo en función de la configuración del equipo o servidor.

Puedes usar el marco de compatibilidad de paquetes (PSF) para ejecutar un script de PowerShell antes de que se ejecute un ejecutable de aplicación empaquetado y un script de PowerShell después de que se ejecute el ejecutable de la aplicación para limpiarlo. Cada archivo ejecutable de aplicación definido en el manifiesto de aplicación puede tener sus propios scripts. Puedes configurar el script para que se ejecute una sola vez en el primer inicio de la aplicación y sin mostrar la ventana de PowerShell para que los usuarios no finalicen el script prematuramente por error. Hay otras opciones para configurar la forma en que se pueden ejecutar los scripts, que se muestran a continuación.

Requisitos previos

Para habilitar los scripts para ejecutarse, debes establecer la directiva de ejecución de PowerShell en RemoteSigned. Para ello, ejecuta este comando:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

La directiva de ejecución debe establecerse tanto para el ejecutable de PowerShell de 64 bits como para el ejecutable de PowerShell de 32 bits. Asegúrate de abrir cada versión de PowerShell y ejecutar uno de los comandos mostrados anteriormente.

Estas son las ubicaciones de cada archivo ejecutable.

  • Equipo de 64 bits:
    • Ejecutable de 64 bits: %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
    • Ejecutable de 32 bits: %SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
  • Equipo de 32 bits:
    • Ejecutable de 32 bits: %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe

Para más información sobre las directivas de ejecución de PowerShell, consulta este artículo.

🚩 Asegúrate de incluir también el archivo StartingScriptWrapper.ps1 en el paquete y colócalo en la misma carpeta que el ejecutable. Puedes copiar este archivo desde el paquete NuGet de PSF o desde el repositorio de Github de PSF.

Habilitación de los scripts

Para especificar qué scripts se ejecutarán para cada ejecutable de aplicación empaquetada, debes modificar el archivo config.json. Para indicar a PSF que ejecute un script antes de la ejecución de la aplicación empaquetada, agrega un elemento de configuración denominado startScript. Para indicar a PSF que ejecute un script una vez finalizada la aplicación empaquetada, agrega un elemento de configuración denominado endScript.

Elementos de configuración de script

A continuación se muestran los elementos de configuración disponibles para los scripts. El script final omite los elementos de configuración waitForScriptToFinish y stopOnScriptError.

Nombre de clave Tipo de valor ¿Necesario? Valor predeterminado Descripción
scriptPath string N/D Ruta de acceso al script, incluido el nombre y la extensión. La ruta de acceso es relativa al directorio de trabajo de la aplicación si se especifica; de lo contrario, se inicia en el directorio raíz del paquete.
scriptArguments string No empty Lista de argumentos delimitados por espacios. El formato es el mismo para una llamada de script de PowerShell. Esta cadena se anexa a scriptPath para realizar una llamada válida a PowerShell.exe.
runInVirtualEnvironment boolean No true Especifica si el script debe ejecutarse en el mismo entorno virtual en el que se ejecuta la aplicación empaquetada.
runOnce boolean No true Especifica si el script se debe ejecutar una vez por usuario, por versión.
showWindow boolean No false Especifica si se muestra la ventana de PowerShell.
stopOnScriptError boolean No false Especifica si se cierra la aplicación si se produce un error en el script de inicio.
waitForScriptToFinish boolean No true Especifica si la aplicación empaquetada debe esperar a que finalice el script inicial antes de comenzar.
timeout DWORD No INFINITE Cuánto tiempo se permitirá que se ejecute el script. Cuando transcurre el tiempo, se detendrá el script.

Nota:

No se admite la configuración de stopOnScriptError: true y waitForScriptToFinish: false para la aplicación de ejemplo. Si establece ambos elementos de configuración, PSF devolverá el error ERROR_BAD_CONFIGURATION.

Configuración de ejemplo

Esta es una configuración de ejemplo con dos ejecutables de aplicación diferentes.

{
  "applications": [
    {
      "id": "Sample",
      "executable": "Sample.exe",
      "workingDirectory": "",
      "stopOnScriptError": false,
      "startScript":
      {
        "scriptPath": "RunMePlease.ps1",
        "scriptArguments": "\\\"First argument\\\" secondArgument",
        "runInVirtualEnvironment": true,
        "showWindow": true,
        "waitForScriptToFinish": false
      },
      "endScript":
      {
        "scriptPath": "RunMeAfter.ps1",
        "scriptArguments": "ThisIsMe.txt"
      }
    },
    {
      "id": "CPPSample",
      "executable": "CPPSample.exe",
      "workingDirectory": "",
      "startScript":
      {
        "scriptPath": "CPPStart.ps1",
        "scriptArguments": "ThisIsMe.txt",
        "runInVirtualEnvironment": true
      },
      "endScript":
      {
        "scriptPath": "CPPEnd.ps1",
        "scriptArguments": "ThisIsMe.txt",
        "runOnce": false
      }
    }
  ],
  "processes": [
    ...(taken out for brevity)
  ]
}