scripts - El script de PowerShell no se ejecuta como una tarea programada de Windows
programar en powershell (5)
Hay varias causas posibles para que un script de PowerShell invocado por el programador de tareas se complete con el código 0x1
:
- La política de ejecución no permite que el script se ejecute. Vea la excelente respuesta de Briantist para detalles sobre esto.
- La tarea no tiene habilitada la
Run with highest privileges
(casilla de verificación en la pestaña General de la tarea). - Los parámetros se están pasando a la secuencia de comandos incorrectamente. Si utiliza un método como
-File "./MyScript.ps1" -Parameter1 ''Demo''
, intente:-Command "& ./MyScript.ps1 -Parameter1 ''Demo''"
Tengo un script de PowerShell (que funciona). En el Programador de tareas de Windows, creé una nueva tarea para ejecutar "C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe"
, pasando el argumento como mi script de PS1. Cuando la tarea se ejecuta, obtengo un Resultado de última ejecución de 0x1
.
Actualicé mi script para escribir en un archivo de registro cuando el script se abre y eso no está sucediendo. Es casi como si la tarea no pudiera abrir Powershell.exe.
¿Esto suena exacto? ¿Cuál podría ser el problema o cómo puedo solucionarlo?
He hecho esto antes y tuve problemas similares. Es casi siempre la configuración de seguridad de PowerShell. Lo más obvio es que revisaría la política de ejecución (suponiendo que la hayas configurado).
¿Qué usuario ejecuta la tarea como? ¿Ese usuario ha ejecutado un script de PowerShell antes? Si recuerdo bien, se le pide a cada usuario que "permita" que se ejecuten (S / N) los scripts de PowerShell, cuando se ejecuta un script por primera vez (independientemente de la política de ejecución). Eso me ha mordido antes. Tratar:
- iniciar sesión como ese usuario
- consultar la política de ejecución
- iniciar el script desde un indicador de PowerShell
- Responda a cualquier pregunta que siga.
Después de la primera ejecución, no debería tener que preocuparse por eso otra vez, y debería ejecutarse desde el programador de tareas muy bien.
Dependiendo de la seguridad de su dominio, es posible que también deba configurar la política de ejecución del grupo. Aquí hay un artículo que detalla cómo hacerlo, así como un par de otras cosas para verificar: PowerShell Security .
Las respuestas anteriores son de gran valor. Agregué el siguiente valor en el campo Agregar argumentos .
-noninteractive -nologo -command "&{path/to/script.ps1}"
Asegúrate de agregar el símbolo y encerrar la ruta entre llaves. No se olvide de tener comillas dobles antes de la suma y después de cerrar las llaves.
Si el problema que tiene es con la Política de ejecución, también puede establecer la política de ejecución de una invocación específica de PowerShell. Esto es lo que normalmente hago cuando ejecuto PowerShell a través de una tarea programada:
powershell.exe -NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File //path/to/script.ps1
¿Por qué?
-Sin perfil
Esto garantiza que no confíe en nada en el perfil de PowerShell del usuario y evita la sobrecarga de ejecutar ese código adicional.
-Sin logo
Esto en su mayoría no importa; tal vez lo haga si está capturando la salida de su script. Sobre todo me hace sentir mejor.
-No interactivo
Asegura que su tarea no espere indefinidamente si algo en su secuencia de comandos solicita al usuario de forma inesperada. Con este interruptor, el script simplemente saldrá en su lugar; al menos tendrás un código de error en lugar de un script que cuelga.
-ExecutionPolicy Bypass
Puede usar Unrestricted
aquí o la política de ejecución que desee. Este es probablemente el que más necesitas .
Por qué prefiero configurar la política de ejecución de esta manera:
Porque no quiero que la tarea dependa de una configuración global no predeterminada que puede tener otras razones para cambiar en el futuro. Si algún otro proceso depende de una política de ejecución diferente, entonces no está reñido con su tarea de esta manera.
Además, siempre es bueno no tener que cambiar los valores predeterminados. Menos para recordar / documento / prueba.
Prima
Consulte la respuesta de JohnBevan para conocer algunas causas adicionales del resultado 0x1
en una tarea programada .
Si no tiene ningún mensaje de error y no sabe cuál es el problema: por qué los scripts de PowerShell no desean comenzar desde una tarea programada, siga los siguientes pasos para obtener la respuesta:
- Ejecute CMD como un usuario que se ha configurado para la tarea programada para ejecutar el script de PowerShell
- Vaya a la carpeta donde se encuentra el script de PowerShell
- Ejecute la secuencia de comandos de PowerShell (elimine todas las declaraciones que bloquean las notificaciones de error si existe alguna dentro de la secuencia de comandos como $ ErrorActionPreference = ''silentlycontinue'')
Debes poder ver todas las notificaciones de error.
En el caso de uno de mis guiones fue:
No se puede encontrar el tipo [System.ServiceProcess.ServiceController]. Asegúrese de que el ensamblaje que contiene este tipo esté cargado.
Y en este caso tengo que agregar una línea adicional al principio del script para cargar el ensamblaje faltante:
Add-Type -AssemblyName "System.ServiceProcess"
Y los siguientes errores:
La excepción llama a "GetServices" con "1" argumento (s): "No se puede abrir Service Control Manager en la computadora ''''. Esta operación puede requerir otros privilegios".
seleccione: la propiedad no se puede procesar porque la propiedad "Nombre de la base de datos" ya existe