Comment rediriger la sortie powershell lors de l'exécution à partir du Planificateur de tâches?
Lors de l'exécution d'un script powershell simple à partir du Planificateur de tâches, je voudrais rediriger la sortie vers un fichier.
Il y a un long fil sur ce sujet même ici , mais ce n'est pas clair s'ils ont atteint la solution la plus appropriée à la fin. Je suis intéressé si quelqu'un a également résolu ce problème, et comment ils l'ont fait.
8 réponses
Voici la commande qui a fonctionné pour moi. Je n'aimais pas l'idée de rediriger la sortie dans le script, car cela rendrait difficile pour l'exécuter manuellement.
powershell -windowstyle minimized -c "powershell -c .\myscript.ps1 -verbose >> \\server\myscript.log 2>&1"
J'utilise la fonction de transcription pour aider à cela. Il suffit de l'inclure dans votre code et il génère tout le contenu de l'écran (serait) dans un fichier journal.
Start-Transcript -path $LogFile -append
<body of script>
Stop-Transcript
Ce qui suit fonctionne pour moi sur windows 7:
powershell -command c:\temp\pscript.ps1 2>&1 > c:/temp/apickles.log
Dans l'interface graphique du Planificateur de tâches win7:
program = "Powershell"
arguments = "-command c:\temp\pscript.ps1 2>&1 > c:/temp/apickles.log"
Notez que "- file " ne fonctionne pas car tous les paramètres après le nom du fichier sont interprétés comme des paramètres du fichier. Notez que "2> & 1" redirige également la sortie d'erreur vers le fichier journal. Les versions ultérieures de powershell le font d'une manière légèrement différente.
Je devrais faire : créez une fonction pour appeler votre script et rediriger la sortie de cette fonction comme ceci:
.ps1:
function test{
#your simple script commands
ls c:\temp -Filter *.JPG
ls z:\ #non existent dir
}
test *> c:\temp\log.txt
Voici le fichier journal:
Répertoire : C:\temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 07/06/2008 11:06 176275 HPIM1427.JPG
-a--- 07/06/2008 11:06 69091 HPIM1428.JPG
-a--- 07/06/2008 11:06 174661 HPIM1429.JPG
ls : Lecteur introuvable. Il n'existe aucun lecteur nommé « z ».
Au caractère C:\temp\test.ps1:14 : 1
+ ls z:\ #non existent dir
+ ~~~~~~
+ CategoryInfo : ObjectNotFound: (z:String) [Get-ChildItem], Driv
eNotFoundException
+ FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetC
hildItemCommand
Vous pouvez contrôler ce que vous voulez produire avec les nouveaux opérateurs de redirection V3:
Do-Something 3> warning.txt # Writes warning output to warning.txt
Do-Something 4>> verbose.txt # Appends verbose.txt with the verbose output
Do-Something 5>&1 # Writes debug output to the output stream
Do-Something *> out.txt # Redirects all streams (output, error, warning, verbose, and debug) to out.txt
Je me rends compte que cela a déjà été répondu à quelques reprises, mais une combinaison de toutes les réponses ci-dessus m'a vraiment aidé...
Mon problème était que je devais exécuter un script Powershell sur WinRM dans le cadre d'un provisionneur de Packer et qu'il continuait à échouer en raison de problèmes de droits. Le moyen de contourner cela est de s'exécuter en tant que tâche planifiée, mais j'avais besoin de passer des arguments au script et d'obtenir la sortie pour confirmer tout ce qui était passé.
Cet extrait a bien fonctionné pour moi:
# Generate a Unique ID for this execution
$guid = [guid]::NewGuid()
$logFile = "c:\Windows\Temp\$guid.log"
$argument = "-NoProfile -ExecutionPolicy unrestricted -Command ""& {""$ScriptPath"" $ScriptArgs} 2>&1 > $logFile"""
$a = New-ScheduledTaskAction -Execute "powershell.exe" -Argument $argument
Register-ScheduledTask -TaskName $TaskName -RunLevel Highest -User $username -Password $password -Action $a | Start-ScheduledTask
do{
Start-Sleep -Seconds 30
$task = Get-ScheduledTask -TaskName $TaskName
} while ($task.State -eq 4)
Le script complet peut être trouvé ici:
Https://gist.github.com/dev-rowbot/fa8b8dadf1b3731067a93065db3e1bba
Il serait peut-être plus facile d'utiliser Start-Transcript pour se connecter directement à un fichier:
# Get script name
$ScriptFullPath = $MyInvocation.MyCommand.Path
# Start logging stdout and stderr to file
Start-Transcript -Path "$ScriptFullPath.log" -Append
[Some powershell commands]
# Stop logging
Stop-Transscript
Fichier Journal sera dans le même répertoire que le script.
Powershell 3 sur wardspermet aux flux individuels (out, verbose, error) d'être redirigés. Cependant le Planificateur de Tâches ne les comprend pas. C'est le powershell qui fait la redirection.
La solution de@cmcginty fonctionne à mi-chemin, puisque le powershell invoque le powershell, il ne prend en charge que les flux standard (erreur, sortie). Si vous voulez utiliser tous les strewams, vous devez utiliser
Programme ou Script: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Argument: -windowstyle minimized –NonInteractive –NoProfile -c "powershell -c path_to_ps1.ps1 4>>verbose.log 5>>debug.log"
Commencez Par: path_to_ps1
C'envoyer détaillé mettre t l'écran ainsi que de l'enregistrer dans un fichier il a fallu un certain temps pour comprendre cela, donc ce fil semblait l'endroit le plus approprié pour le mettre
something your doing -Verbose 4>&1|Tee-Object "C:\logs\verb.log" -Append