J'ai un script PowerShell (qui fonctionne). Dans le Planificateur de tâches Windows, j'ai créé une nouvelle tâche pour exécuter "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
, en transmettant l'argument comme script PS1. Lorsque la tâche est exécutée, le résultat de la dernière exécution est 0x1
.
J'ai mis à jour mon script pour écrire dans un fichier journal lorsque le script s'ouvre et que cela ne se produit pas. C'est presque comme si la tâche ne pouvait même pas ouvrir Powershell.exe.
Cela semble-t-il exact? Quel pourrait être le problème ou comment puis-je le contourner?
Si le problème que vous rencontrez concerne la stratégie d'exécution, vous pouvez également définir la stratégie d'exécution d'un appel spécifique de PowerShell. Voici ce que je fais généralement lorsque j'exécute PowerShell via une tâche planifiée:
powershell.exe -NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File \\path\to\script.ps1
Cela garantit que vous (ne vous fiez à rien dans le profil PowerShell de l'utilisateur) , et évite la surcharge liée à l'exécution de ce code supplémentaire.
Cela n'a généralement pas d'importance; c'est peut-être le cas si vous capturez la sortie de votre script. Surtout ça me fait me sentir mieux.
Garantit que votre tâche n'attendra pas indéfiniment si quelque chose dans votre script invite l'utilisateur à le faire de manière inattendue. Avec ce commutateur, le script va simplement quitter; au moins, vous aurez un code d'erreur au lieu d'un script suspendu.
Vous pouvez utiliser Unrestricted
ici ou selon la stratégie d'exécution de votre choix. C'est probablement celui dont vous avez le plus besoin.
Parce que je ne veux pas que la tâche dépende d'un paramètre global autre que celui par défaut, vous pourriez avoir d'autres raisons de changer à l'avenir. Si un autre processus dépend d'une stratégie d'exécution différente, votre tâche ne se trouve pas de cette façon.
De plus, il est toujours agréable de ne pas avoir à changer les valeurs par défaut. Moins à retenir/documenter/tester.
Il existe plusieurs causes possibles pour qu'un script PowerShell appelé par le planificateur de tâches se termine avec le code 0x1
:
Run with highest privileges
(case à cocher de l'onglet Général de la tâche) n'est pas activé.-File ".\MyScript.ps1" -Parameter1 'Demo'
, essayez plutôt: -Command "& .\MyScript.ps1 -Parameter1 'Demo'"
Je l'ai déjà fait et j'ai eu des problèmes similaires. Ce sont presque toujours les paramètres de sécurité PowerShell. Bien évidemment, je revérifierais votre politique d’exécution (en supposant que vous l’ayez définie).
Sous quel utilisateur la tâche est-elle exécutée? Cet utilisateur a-t-il déjà exécuté un script PowerShell? Si je me souviens bien, chaque utilisateur est invité à "autoriser" l'exécution de scripts PowerShell (Y/N) lors de l'exécution initiale d'un script (quelle que soit la stratégie d'exécution). Cela m'a déjà mordu. Essayer:
Après la première exécution, vous ne devriez plus avoir à vous en préoccuper et il devrait très bien fonctionner à partir du planificateur de tâches.
En fonction de la sécurité de votre domaine, vous devrez peut-être également définir la stratégie d'exécution du groupe. Voici un article qui explique en détail comment faire cela, ainsi que quelques autres éléments à vérifier: PowerShell Security.
Les réponses précédentes sont d'une grande valeur. J'ai ajouté la valeur ci-dessous dans le champ Ajouter des arguments .
-noninteractive -nologo -command "&{path\to\script.ps1}"
Assurez-vous d’ajouter la perluète et de placer le chemin entre accolades. N'oubliez pas les guillemets avant esperluette et après la fermeture des accolades.
Si vous ne recevez aucun message d'erreur et ne savez pas quel est le problème - pourquoi les scripts PowerShell ne veulent pas démarrer à partir d'une tâche planifiée, procédez comme suit pour obtenir la réponse:
Vous devriez pouvoir voir toutes les notifications d'erreur.
Dans le cas d'un de mes scripts, c'était:
Impossible de trouver le type [System.ServiceProcess.ServiceController]. Assurez-vous que l'assembly qui contient ce type est chargé.
Et dans ce cas, je dois ajouter une ligne supplémentaire au début du script pour charger l'assembly manquant:
Add-Type -AssemblyName "System.ServiceProcess"
Et les prochaines erreurs:
Exception appelant "GetServices" avec le ou les arguments "1": "Impossible d'ouvrir Service Control Manager sur ordinateur ''. Cette opération peut nécessiter d'autres privilèges."
select: la propriété ne peut pas être traitée car la propriété "Nom de la base de données" existe déjà