Question
Script ne fonctionne pas en tâche planifiée
- Toper
- Auteur du sujet
- Hors Ligne
- Membre premium
- Messages : 145
- Remerciements reçus 0
La seule différence entre le lancement ISE et par tâche planifiée est cette ligne (rajoutée si lancement manuel ISE):
C:\Users\<username>\AppData\Roaming\Composer\vendor\bin
Powershell: la vie est belle
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Si toutefois cela vient de là.
Ton code n'a pas de référence explicite sur ce type [System.Runtime.Loader.AssemblyLoadContext] ?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Toper
- Auteur du sujet
- Hors Ligne
- Membre premium
- Messages : 145
- Remerciements reçus 0
j'ai tout simplement ajouté dans mon script cette ligne:
$env:path +=";C:\Users\<username>\AppData\Roaming\Composer\vendor\bin"
Alors j'ai modifié la tâche planifiée pour mettre comme argument:
-command & "chemin_vers_le_script.ps1"
Sauf que:
quand je lance le script par ISE il ne me met aucune erreur. Mais si je le lance par la tâche, il me met une erreur vide:
function Load-Module
{
param (
[parameter(Mandatory = $true)][string] $name
)
$retVal = $true
if (!(Get-Module -Name $name))
{
$retVal = Get-Module -ListAvailable | where { $_.Name -eq $name }
if ($retVal)
{
try
{
Import-Module $name -ErrorAction SilentlyContinue
}
catch
{
$retVal = $false
}
}
}
return $retVal
}
Try {
$name = "ActiveDirectory"
} catch {
Write-Output "Une erreur s'est produite : $($Error.exception.message)" | Out-File C:\Users\buenadg\Desktop\Load_AD_Module_Error.txt
}
$env:path +=";C:\Users\<username>\AppData\Roaming\Composer\vendor\bin"
Try {
$SearchBase = "OU=mon_OU,DC=domain,DC=lan"
$users = Get-ADUser -SearchBase $SearchBase -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False -and PasswordLastSet -gt 0 } `
-Properties "SamAccountName", "EmailAddress", "msDS-UserPasswordExpiryTimeComputed" | Select-Object -Property "SamAccountName", "EmailAddress", `
@{Name = "PasswordExpiry"; Expression = {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed").tolongdatestring() }} -ErrorAction Continue
} catch {
} Write-Output "Une erreur s'est produite : $($Error.exception.message)" | Out-File C:\Users\<username>\Desktop\get-aduser_Error.txt
Il me créé le fichier "get-aduser_Error.txt", mais vide....
Pourquoi donc ?
Powershell: la vie est belle
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Try {
$name = "ActiveDirectory"
} catch {
Write-Output "Une erreur s'est produite : $($Error.exception.message)" | Out-File C:\Users\name\Desktop\Load_AD_Module_Error.txt
}
Write-Output est redondant, l'émission d'une chaine dans le pipeline suffit.
Parce que le vendredi on n'a pas les yeux en face des trousgregmurf écrit: Il me créé le fichier "get-aduser_Error.txt", mais vide....
Pourquoi donc ?
D'une part, dans un bloc catch on référence l'erreur avec $_ et d'autre part write-output est en dehors du bloc catch.
Le message "Une erreur s'est produite" est faux car tu enregistres tous les erreurs et enfin avec -ErrorAction Continue pas besoin de try/catch car tu ne tiens pas comptes des erreurs.
Allez une dernière pour la route pour :
Import-Module $name -ErrorAction SilentlyContinue
La présence de -ErrorAction SilentlyContinue dans un bloc try catch me laisse dubitatif. Sache qu'un import-module d'un module chargé ne fait rien, sauf si on précise -Force pour le recharger.
Après si tu as codé de cette manière cela il y a peut être une raison ou des raisons mais je ne les connais pas. Il m'est donc difficile de répondre à ta question 'Pourquoi donc'.
Le principale est que tu ais pu avancer sur le sujet
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Toper
- Auteur du sujet
- Hors Ligne
- Membre premium
- Messages : 145
- Remerciements reçus 0
J'ai du zapper un bout...:le try me semble inutile à moins que $Name ait une conception particulière.
Try {
$name = "ActiveDirectory"
Load-Module $name
} catch {
Write-Output "Une erreur s'est produite1 : $($Error.exception.message)" #| Out-File C:\Users\buenadg\Desktop\Load_AD_Module_Error.txt
}
Mais un module ne s'installe qu'une fois et ensuite on fait appel à lui, donc ce bloc ne sert à rien si je te comprends bien.
Je n'ai pas tout compris (je suis novice tu l'auras compris )Write-Output est redondant, l'émission d'une chaine dans le pipeline suffit.
C'est clair....Parce que le vendredi on n'a pas les yeux en face des trous
Comme ceci et rien d'autre ?D'une part, dans un bloc catch on référence l'erreur avec $_
try {
blabla
} catch {
$_
}
OMG... oui ça crève les yeux le lundi matin...et d'autre part write-output est en dehors du bloc catch.
Oui ça n'a rien à faire là ...La présence de -ErrorAction SilentlyContinue dans un bloc try catch me laisse dubitatif
Donc supprimer -ErrorAction SilentlyContinue (et faire un try / catch ?)Ton module peut exister mais provoquer une erreur, il est préférable de laisser les exceptions remonter vers l'appelant, lui seul peut décider quoi faire dans ce cas.
Ok.Sache qu'un import-module d'un module chargé ne fait rien, sauf si on précise -Force pour le recharger.
Donc à partir du moment où je l'ai installé une première fois, la partie Load-module ne sert plus à rien. Le get-aduser se chargera d'y faire appel.
Merci pour ton aide en tout cas !
Powershell: la vie est belle
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Vu de ma fenêtre non, mais on se pose tjr des questions lorsqu'on lit ce type de code.gregmurf écrit: Mais un module ne s'installe qu'une fois et ensuite on fait appel à lui, donc ce bloc ne sert à rien si je te comprends bien.
gregmurf écrit: Je n'ai pas tout compris (je suis novice tu l'auras compris )
Write-Output 'Test'|% {$_}
'Test'|% {$_}
Pas tout à fait, écrit comme ça tu émets un objet dans le pipeline, selon les besoins( log, analyse, redéclenchement) il faut coder autour de $_ qui est l'exception courante dans un bloc catch.gregmurf écrit: Comme ceci et rien d'autre ?
Oui et le try catch est dans l'appelant.gregmurf écrit: Donc supprimer -ErrorAction SilentlyContinue (et faire un try / catch ?)
Load-module sert à initialiser explicitement les prérequis de ton traitement.Pour la fin de ta phrase, oui, mais sache que si le chargement automatique des modules est configuré, il l'est par défaut, le premier appel à Get-User va charger le module. Je te conseille de tjr préciser les chargement.gregmurf écrit: Donc à partir du moment où je l'ai installé une première fois, la partie Load-module ne sert plus à rien. Le get-aduser se chargera d'y faire appel.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- Script ne fonctionne pas en tâche planifiée