web-dev-qa-db-fra.com

Comment rediriger la sortie Powershell lorsqu'il est exécuté à partir du Planificateur de tâches?

Lors de l’exécution d’un script PowerShell simple à partir du Planificateur de tâches, je souhaite rediriger la sortie vers un fichier. 

Il y a un long fil sur ce sujet même ici , mais on ne sait pas s'ils ont finalement atteint la solution la plus appropriée. Je suis intéressé si quelqu'un sur SO a également résolu ce problème et comment il l'a fait.

32
cmcginty

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 l'exécution manuelle.

powershell -windowstyle minimized -c "powershell -c .\myscript.ps1 -verbose >> \\server\myscript.log 2>&1"
31
cmcginty

J'utilise la fonctionnalité de transcription pour aider avec cela. Il suffit de l’inclure dans votre code et il enregistre tout le contenu de l’écran dans un fichier journal.

    Start-Transcript -path $LogFile -append

    <body of script>

    Stop-Transcript
25
TAC

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.

15
amtwister

Je devrais faire: Créer 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 générer 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
1
Loïc MICHEL

Powershell 3 sur Wards permet aux flux individuels (sortants, verbeux, erreurs) 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 powershell l'invoque, elle ne supporte que les flux standard (error, out). 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"

Commencer dans: path_to_ps1

0
Adarsha

Je me rends compte que cela a déjà été répondu plusieurs fois, mais une combinaison de toutes les réponses ci-dessus m'a vraiment aidé. 

Mon problème était que j'avais besoin d'exécuter un script Powershell sur WinRM dans le cadre d'un approvisionneur Packer et que cela échouait à cause de problèmes de droits. La solution consiste à exécuter une tâche planifiée, mais j’ai eu besoin de transmettre des arguments au script et d’obtenir le résultat également pour confirmer tout ce qui a été 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

0
dev-rowbot

Il serait peut-être plus facile d'utiliser Start-Transcript afin de 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

Le fichier journal sera dans le même répertoire que le script.

0
Orsiris de Jong