11

PowerShellを使用して、アクションを含むサーバー上のスケジュールされたタスクのインベントリを作成するリンクまたはスクリプトを持っている人はいますか?

スケジュールされたサービスのcomオブジェクトと、「トップレベル」のプロパティ(名前、状態、lastruntime)を取得できますが、スケジュールタスクの「アクション」部分(基本的には名前)からも情報を取得したいと思います。スケジュールされたタスクとそのコマンドラインの)。

例えば:

$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
}
}

上記のコードスニペットは、タスクの一覧表示に関して機能します。しかし、アクションのループは、エラーも出力もまったく行わないように見えます。

どんな助けでもいただければ幸いです。

4

5 に答える 5

15

これはおそらく現在の回答と非常に似ていますが、私はあなたを動かすための簡単なスクリプトを書きました。現在のスクリプトの問題はActions、タスクにプロパティがないことです。comobjectが提供するxmltask-definitionからそれを抽出する必要があります。次のスクリプトは、スケジュールされたタスクごとに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
于 2013-03-16T12:48:29.020 に答える
1

W7 RKからPowerShellPackを入手し、get-scheduledtaskを試してください

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

MSDNからの抜粋:

Windows7リソースキットPowerShellPackには、PowerShellであらゆる種類の興味深いことを実行するための10個のモジュールが含まれています。Import-Module PowerShellPackは、実際に使用する10個のモジュールをインポートします。各モジュールの概要は次のとおりです。

  • WPKWindowsPowerShellからリッチなユーザーインターフェイスをすばやく簡単に作成します。HTAと思いますが、簡単です。迅速なユーザーインターフェイスの構築に役立つ600を超えるスクリプト
  • TaskSchedulerスケジュールされたタスクを一覧表示し、タスクを作成または削除します
  • FileSystemはファイルとフォルダを監視し、重複ファイルをチェックし、ディスク容量をチェックします
  • IsePackは、35を超えるショートカットを使用して、統合スクリプト環境でスクリプトを強化します。
  • DotNetロードされた型を調べ、型を操作できるコマンドを見つけ、PowerShell、DotNet、およびCOMを一緒に使用する方法を調べます
  • PSImageTools画像の変換、回転、拡大縮小、トリミング、および画像メタデータの取得
  • PSRSSPowerShellからFeedStoreを利用する
  • PSSystemToolsはオペレーティングシステムまたはハードウェア情報を取得します
  • PSUserToolsシステムでユーザーを取得し、昇格を確認して、processaadministratorを開始します
  • PSCodeGenは、PowerShellスクリプト、C#コード、およびP/Invokeを生成します
于 2013-03-15T18:27:01.810 に答える
1

別の方法は、この記事で利用できるGet-ScheduledTask.ps1と呼ばれる私が書いたスクリプトです。

ハウツー:PowerShellを使用してスケジュールされたタスクについてレポートする

このように、この単一のスクリプトのみが必要であり、他のものをダウンロードまたはインストールする必要はありません。

明細書

于 2013-03-15T19:02:48.043 に答える
1

パーティーに遅れていることは知っていますが、@ 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

を使用せずにコレクションから1つのアイテムを取得する方法はこれですべて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。

于 2015-06-12T19:53:19.297 に答える
1

ここに基づいた簡単なもの: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
于 2018-11-02T18:23:27.323 に答える