2012-12-09 11 views

risposta

26

Ecco il comando che ha funzionato per me. Non mi piaceva l'idea di reindirizzare l'output nello script, dal momento che renderebbe difficile l'esecuzione manuale.

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

Si potrebbe anche voler usare -Noninteractive per evitare qualsiasi richiesta. – David

+4

Come si aggiunge un timestamp a questo? – Anders

+0

Se qualcuno sa come farlo con gli spazi nei percorsi dei file mi piacerebbe sapere come. Non riesco a ottenere il parser per analizzare correttamente le virgolette doppie, virgolette singole o virgolette di escape. – MrEdmundo

1

I whould faccio: creare una funzione per chiamare lo script e reindirizzare l'uscita di questa funzione come questa:

ps1:

function test{ 
    #your simple script commands 
    ls c:\temp -Filter *.JPG 
    ls z:\ #non existent dir 
} 

test *> c:\temp\log.txt 

Ecco il file di registro:

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 

È possibile controllare ciò che si desidera produrre con i nuovi operatori di reindirizzamento 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 
+0

Ma * * funziona quando si esegue da un'attività pianificata? Perché la domanda implica che non lo fa. – codeulike

19

Io uso la funzione di trascrizione per aiutare con questo. Inseriscilo nel tuo codice e visualizza tutto (sarebbe) contenuto dello schermo in un file di registro.

Start-Transcript -path $LogFile -append 

    <body of script> 

    Stop-Transcript 
+4

Vedo un comportamento diverso per le trascrizioni quando avvio il modulo di comando Utilità di pianificazione (come argomento per powershell.exe). Nello specifico, le chiamate a Write-Host sembrano inviare il mio testo da qualche parte in cui la trascrizione non viene acquisita, sebbene il reindirizzamento verso Out-Host sembra funzionare. Sto eseguendo PowerShell 4.0 su Windows Server 2012 R2 se questo è importante. –

+5

Ho dovuto usare Write-Output piuttosto che Write-Host. –

+1

@JayCarlton dovresti usare l'host di scrittura ma scrivere in uscita invece come dice il creatore di powershell: http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/ che ha detto , Non ho testato se farà la differenza nel tuo log ma dovrebbe. – Marlon

11

le seguenti opere per me su Windows 7:

powershell -command c:\temp\pscript.ps1 2>&1 > c:/temp/apickles.log 

nella GUI win7 Task Scheduler:

program = "Powershell" 
arguments = "-command c:\temp\pscript.ps1 2>&1 > c:/temp/apickles.log" 

nota che "-file" non funziona perché tutti i parametri dopo il nome del file viene interpretato come parametri del file. Nota che "2> & 1" reindirizza anche l'output dell'errore al file di registro. Le versioni successive di PowerShell lo fanno in un modo leggermente diverso.

+0

Grazie per il commento sull'argomento "Arguments" di Windows 7 Task Scheduler - Suppongo che sia il posto giusto dove mettere le opzioni di reindirizzamento dell'output. Nessuna delle altre risposte ha menzionato questo. –

+0

sì! +1 per quello, anche se personalmente sapevo che già ... sembra degno di specifiche per la domanda posta –

+0

-1 per win10. Non funziona per me in Windows 10. Questo post ha lo stesso problema. https://social.technet.microsoft.com/Forums/windowsserver/en-US/985ce84c-ac55-4fe8-b652-259d5373f747/redirect-script-output-to-file-in-task-scheduler?forum=winserverpowershell – mzhang

-1

questa mandata verbose mettere fuori t lo schermo così come accedere a un file voluto un po 'per capirlo in modo da questa discussione sembrava il luogo più adatto per dirla

something your doing -Verbose 4>&1|Tee-Object "C:\logs\verb.log" -Append 
0

Mi rendo conto che questo ha ho già risposto un paio di volte ma una combinazione di tutte le risposte sopra mi ha davvero aiutato ...

Il mio problema era che avevo bisogno di eseguire uno script PowerShell su WinRM come parte di un provisioner di Packer e continuava a mancare a causa di problemi di diritti. Il modo per aggirare questo è quello di eseguire come un compito programmato, ma ho avuto bisogno di passare argomenti allo script e ottenere l'output anche per confermare tutto ciò che è passato.

Questo frammento funzionato bene per me:

# 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) 

Lo script completo può essere trovato qui:

https://gist.github.com/dev-rowbot/fa8b8dadf1b3731067a93065db3e1bba

0

Sarebbe forse più facile da usare Start-Transcript per effettuare il login direttamente in un file:

# 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 

Il file di registro sarà nella stessa d Irectory come la sceneggiatura.