2013-03-15 10 views
8

Qualcuno ha un collegamento o uno script che utilizza PowerShell per fare l'inventario delle attività pianificate su un server, inclusa l'azione?come utilizzare PowerShell per inventariare attività pianificate

Sono in grado di ottenere l'oggetto com Servizio pianificato e quelle che chiamerei proprietà "di primo livello" (nome, stato, lastruntime), ma vorrei anche ottenere informazioni dalla parte "Azioni" dell'Attività di pianificazione (in sostanza, il nome dell'attività pianificata e la sua riga di comando).

Ad esempio:

$schedule = new-object -com("Schedule.Service") 
$schedule.connect() 
$tasks = $schedule.getfolder("\").gettasks(0) 

$tasks | select Name, LastRunTime 

foreach ($t in $tasks) 
{ 
foreach ($a in $t.Actions) 
{ 
    $a.Path 
} 
} 

È possibile che questo frammento di codice funziona in termini di messa in vendita dei compiti; ma il ciclo sulle Azioni semplicemente non sembra fare nulla, nessun errore, nessuna uscita di sorta.

Qualsiasi aiuto sarebbe apprezzato.

risposta

11

Questo è probabilmente molto simile a risposte attuali, ma ho scritto un breve script per farti andare. Il problema con lo script corrente è che non esiste una proprietà Actions in un'attività. È necessario estrarlo dalla definizione di attività xml fornita da Comobject. Lo script seguente restituirà una matrice di oggetti, uno per attività pianificata. Include l'azione se l'azione è di eseguire uno o più comandi. È solo per farti andare, quindi devi modificarlo per includere più proprietà se ne hai bisogno.

function getTasks($path) { 
    $out = @() 

    # Get root tasks 
    $schedule.GetFolder($path).GetTasks(0) | % { 
     $xml = [xml]$_.xml 
     $out += New-Object psobject -Property @{ 
      "Name" = $_.Name 
      "Path" = $_.Path 
      "LastRunTime" = $_.LastRunTime 
      "NextRunTime" = $_.NextRunTime 
      "Actions" = ($xml.Task.Actions.Exec | % { "$($_.Command) $($_.Arguments)" }) -join "`n" 
     } 
    } 

    # Get tasks from subfolders 
    $schedule.GetFolder($path).GetFolders(0) | % { 
     $out += getTasks($_.Path) 
    } 

    #Output 
    $out 
} 

$tasks = @() 

$schedule = New-Object -ComObject "Schedule.Service" 
$schedule.Connect() 

# Start inventory 
$tasks += getTasks("\") 

# Close com 
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($schedule) | Out-Null 
Remove-Variable schedule 

# Output all tasks 
$tasks 

Es. della produzione

PS > .\Untitled1.ps1 | ? { $_.Name -eq "test" } 


Actions  : notepad.exe c:\test.txt 
       calc.exe 
Path  : \test 
Name  : test 
LastRunTime : 30.12.1899 00:00:00 
NextRunTime : 17.03.2013 13:36:38 
+0

grazie, che ha aiutato immensamente! Immagino di aver avuto difficoltà a tradurre elementi in Powershell (provenienti da C# e .NET), o di trovare la documentazione che ti permette di sapere qual è il modello di oggetto per uno script PS. –

+3

'Get-Member' è tuo amico quando esplora nuovi tipi :) Es. '$ compiti | Get-Member' ti darebbe le proprietà, i metodi, ecc. Per gli oggetti nella tua matrice '$ tasks'. –

1

Prendi il PowerShellPack dal W7 RK, e provare a get-scheduledtask

http://archive.msdn.microsoft.com/PowerShellPack

Estratto da MSDN:

Windows 7 Resource Kit PowerShell confezione contiene 10 moduli per fare ogni sorta di interessante cose con PowerShell. Import-Module PowerShellPack importa in realtà 10 moduli da utilizzare. Ecco una breve panoramica di ciascuno dei moduli.

  • PLC Creare interfacce utente ricche rapido e facilmente da Windows PowerShell. Pensa all'HTA, ma è facile. Oltre 600 gli script per aiutarvi a costruire interfacce utente veloci
  • TaskScheduler Lista operazioni pianificate, creare o eliminare le attività
  • FileSystem file Monitor e cartelle, verificare la presenza di file duplicati, e controllare lo spazio su disco
  • IsePack Supercharge il tuo scripting in Integrated Scripting Environment con oltre 35 scorciatoie
  • DotNet Esplora tipi caricati, trova comandi che possono funzionare con un tipo ed esplora come è possibile utilizzare PowerShell, DotNet e COM insieme
  • PSImageTools convertito, ruotare, scalare e ritagliare le immagini e ottenere l'immagine metadati
  • PSRSS Sfrutta la FeedStore da PowerShell
  • PSSystemTools Get
  • PSUserTools sistema operativo o informazioni sull'hardware Get gli utenti di un sistema, verificare l'elevazione e avviare-processaadministrator
  • PSCodeGen Genera script PowerShell, codice C# e P/Invoke
1

Un altro modo sarebbe uno script che ho scritto chiamato Get-ScheduledTask.ps1, disponibile in questo articolo:

How-To: Use PowerShell to Report on Scheduled Tasks

In questo modo è sufficiente questo singolo script e non è necessario scaricare o installare qualsiasi altra cosa.

Bill

0

So di essere in ritardo alla festa, ma la risposta fornita da @Frode F., mentre si lavora, non è tecnicamente corretto.

È possibile accedere agli elementi della raccolta Azioni di un'attività pianificata tramite PowerShell, non è immediatamente evidente. Ho dovuto pensarci anche io oggi.

Ecco il codice per fare tutto questo in PowerShell, senza dover impazzire con XML:

# I'm assuming that you have a scheduled task object in the variable $task: 
$taskAction = $task.Definition.Actions.Item.Invoke(1) # Collections are 1-based 

Questo è tutto quello che c'è da ottenere un singolo elemento fuori dalla raccolta senza utilizzare foreach.

Poiché la proprietà Actions è una raccolta che contiene una proprietà con parametri Item (ad esempio in C# che si scrive myTask.Actions[0] o in VB myTask.Actions.Item(1)), PowerShell rappresenta questo la proprietà Item come oggetto PSParameterizedProperty. Per chiamare i metodi associati alla proprietà, si utilizza il metodo Invoke (per il getter) e il metodo InvokeSet (per il setter).

ho fatto un test rapido in esecuzione il codice del PO e ha funzionato per me (sto correndo PowerShell 4.0, però, quindi forse che ha qualcosa a che fare con esso):

$schedule = new-object -com("Schedule.Service") 
$schedule.connect() 
$tasks = $schedule.getfolder("\").gettasks(0) 

$tasks | select Name, LastRunTime 

foreach ($t in $tasks) 
{ 
    foreach ($a in $t.Actions) 
    { 
     Write-Host "Task Action Path: $($a.Path)" # This worked 
     Write-Host "Task Action Working Dir: $($a.workingDirectory)" # This also worked 
    } 

    $firstAction = $t.Actions.Item.Invoke(1) 
    Write-Host "1st Action Path: $($firstAction.Path)" 
    Write-Host "1st Action Working Dir: $($firstAction.WorkingDirectory)" 
} 

HTH.

Problemi correlati