アクションを含め、PowerShellを使用してサーバー上のスケジュールされたタスクをインベントリするリンクまたはスクリプトを持っている人はいますか?
スケジュールされたサービスのcomオブジェクトと「トップレベル」のプロパティ(名前、状態、最終実行時間)を取得できますが、スケジュールタスクの「アクション」部分(基本的には名前)からも情報を取得したいと考えています。スケジュールされたタスクとそのコマンドラインの)。
例えば:
$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
}
}
上記のコードスニペットは、タスクのリストに関して機能します。しかし、アクションのループは単に何も実行せず、エラーも出力もありません。
任意の助けいただければ幸いです。
これはおそらく現在の回答と非常に似ていますが、私はあなたを先に進めるための簡単なスクリプトを書きました。現在のスクリプトの問題は、タスクにActions
プロパティがないことです。 comobjectが提供するxmlタスク定義からそれを抽出する必要があります。次のスクリプトは、スケジュールされたタスクごとに1つのオブジェクトの配列を返します。アクションアクションが1つ以上のコマンドを実行する場合が含まれます。それはあなたを手に入れるためだけのものなので、それらを必要とするなら、より多くのプロパティを含むように変更する必要があります。
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
例出力の
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
W7 RKからPowerShellPackを入手し、get-scheduledtaskを試す
http://archive.msdn.Microsoft.com/PowerShellPack
MSDNからの抜粋:
Windows 7リソースキットのPowerShellパックには、PowerShellであらゆる種類の興味深いことを行うための10個のモジュールが含まれています。 Import-Module PowerShellPackは、実際に10個のモジュールをインポートして使用します。以下は、各モジュールの概要です。
私はパーティーに遅れていることはわかっていますが、@ Frode F.が提供する答えは、それが機能している間は技術的に正しくありません。
PowerShell経由でスケジュールされたタスクのActionsコレクションのアイテムにアクセスできますが、すぐにはわかりません。今日も自分でこれを理解しなければなりませんでした。
これは、XMLをいじる必要なしに、PowerShellでこれをすべて行うためのコードです。
_# 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
_
foreach
を使用せずにコレクションから単一のアイテムを取得する方法は、これで全部です。
Actions
プロパティはパラメーター化されたプロパティItem
を含むコレクションであるため(たとえば、C#では_myTask.Actions[0]
_またはVB myTask.Actions.Item(1)
)、PowerShellはItem
プロパティをPSParameterizedProperty
オブジェクトとして表します。プロパティに関連付けられているメソッドを呼び出すには、Invoke
メソッドを使用します(ゲッター用)およびInvokeSet
メソッド(セッター用)。
私はOPのコードを実行する簡単なテストを実行し、それは私のために機能しました(ただし、PowerShell 4.0を実行しているので、おそらくそれはそれと関係があります)。
_$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。
もう1つの方法は、この記事で入手できるGet-ScheduledTask.ps1というスクリプトです。
ハウツー:PowerShellを使用してスケジュールされたタスクについてレポートする
この方法では、この単一のスクリプトのみが必要であり、他のものをダウンロードまたはインストールする必要はありません。
ビル
ここに基づいて簡単なもの: https://blogs.technet.Microsoft.com/heyscriptingguy/2015/01/17/weekend-scripter-use-powershell-to-document-scheduled-tasks/
Powershellを使用:Get-ScheduledTaskおよびGet-ScheduledTaskInfo
### run like >> Invoke-Command -ComputerName localhost, server1, server2 -FilePath C:\tmp\Get_WinTasks.ps1
$taskPath = "\"
$outcsv = "c:\$env:COMPUTERNAME-WinSchTaskDef.csv"
Get-ScheduledTask -TaskPath $taskPath |
ForEach-Object { [pscustomobject]@{
Server = $env:COMPUTERNAME
Name = $_.TaskName
Path = $_.TaskPath
Description = $_.Description
Author = $_.Author
RunAsUser = $_.Principal.userid
LastRunTime = $(($_ | Get-ScheduledTaskInfo).LastRunTime)
LastResult = $(($_ | Get-ScheduledTaskInfo).LastTaskResult)
NextRun = $(($_ | Get-ScheduledTaskInfo).NextRunTime)
Status = $_.State
Command = $_.Actions.execute
Arguments = $_.Actions.Arguments }} |
Export-Csv -Path $outcsv -NoTypeInformation