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.

29
demandé sur cmcginty 2012-12-09 07:35:22

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"
27
répondu cmcginty 2012-12-11 20:20:15

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
23
répondu TAC 2013-06-24 08:28:53

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.

12
répondu amtwister 2014-03-04 06:58:18

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
1
répondu Loïc MICHEL 2012-12-09 07:42:11

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

0
répondu dev-rowbot 2017-01-11 11:08:06

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.

0
répondu deajan 2018-01-26 09:55:21

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

0
répondu Adarsha 2018-06-08 21:59:46

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
-1
répondu Kelly Davis 2016-07-20 22:30:04