PowerShellでこれを行う方法はわかりませんが、サポートされているとは思いません。
例えば:
$tasks = schtasks /query
すべてのタスクを変数$tasks
に格納します
出力例:
Folder: \Microsoft\Windows\WindowsBackup
TaskName Next Run Time Status
======================================== ====================== ===============
ConfigNotification Disabled
プロパティ「TaskName」は簡単には参照できません(つまり、$tasks.TaskName
)
Get-serviceコマンドレットでプロパティを参照する方法のように、$tasks
変数内のTaskNameプロパティを参照する他の方法はありますか?
$services = gsv
$services | Where-Object { Write-Output $_.Name }
schtasksの/ foパラメーターを使用して出力をCSVとして出力し、ConvertFrom-CSVコマンドを使用して出力をPowershellオブジェクトに変換します。
$tasks = schtasks /query /fo CSV | ConvertFrom-CSV
次に、次のように特定のタスク名の検索を使用できます
$myTask = $tasks | Where-Object {$_.TaskName -eq "My_Scheduled_Task"}
私はタスクスケジューラのような自動化ツールである VisualCron を使用しています。 Powershellを実行するための特定のタスクがあります。 2つのモードがあります。VisualCronにPSコードを入力できるインプロセスと、既存のPSファイルにリンクすることもできます。
どちらの方法でも、VisualCronに組み込まれている変数を使用して、Powershellスクリプトに情報を直接渡すことができます。
Powershell/pwshでは、代わりにGet-ScheduledTask
[ ref ]またはGet-ScheduledTaskInfo
を使用します。
必要なことを行うには、カスタムオブジェクトを作成し、schtasks
出力からの詳細をオブジェクトに入力する必要があります。これにより、探していることを実行できるようになります。私はしばらく前にこのために仕事でプロジェクトをしました。私は日曜日にそのコードにアクセスし、それを投稿します。
これが私が作成したスケジュールされたタスククエリスクリプトです。これは私の最初のスクリプトの1つであったため、あまりきれいではありませんが、必要なすべての情報が含まれているはずです。
function query_tasks
{
if ($args -eq '/?')
{
Write-Output "Usage: query_tasks ComputerName taskname"
Write-Output "Task name defaults to wildcard search and can be multiple words."
Write-Output "Computer name, and task names must be included."
}
elseif ($args.length -lt 2)
{
Write-Output "Error: Must include computer name and partial task name to search for."
}
else
{
$CompName = $args[0]
$Tasks = $args[1..($args.length-1)]
$arrTasks = $(schtasks /query /v /fo csv /s $CompName)
$taskName = "`"*$Tasks*`""
$arrTask = $arrTasks -like $taskName -split '","'
$arrSchTasksAttributes = @( )
$arrSchTasksAttributes += "HostName"
$arrSchTasksAttributes += "TaskName"
$arrSchTasksAttributes += "NextRunTime"
$arrSchTasksAttributes += "Status"
$arrSchTasksAttributes += "LastRunTime"
$arrSchTasksAttributes += "LastResult"
$arrSchTasksAttributes += "Creator"
$arrSchTasksAttributes += "Schedule"
$arrSchTasksAttributes += "TaskToRun"
$arrSchTasksAttributes += "StartIn"
$arrSchTasksAttributes += "Comment"
$arrSchTasksAttributes += "ScheduledTaskState"
$arrSchTasksAttributes += "ScheduledType"
$arrSchTasksAttributes += "StartTime"
$arrSchTasksAttributes += "StartDate"
$arrSchTasksAttributes += "EndDate"
$arrSchTasksAttributes += "Days"
$arrSchTasksAttributes += "Months"
$arrSchTasksAttributes += "RunAsUser"
$arrSchTasksAttributes += "DeleteTaskIfNotRescheduled"
$arrSchTasksAttributes += "StopTaskIfRunsXHoursandXMins"
$arrSchTasksAttributes += "Repeat_Every"
$arrSchTasksAttributes += "Repeat_Until_Time"
$arrSchTasksAttributes += "Repeat_Until_Duration"
$arrSchTasksAttributes += "Repeat_StopIfStillRunning"
$arrSchTasksAttributes += "IdleTime"
$arrSchTasksAttributes += "PowerManagement"
$arrTaskObj = $null
$arrTaskObj = New-Object psobject
for ($t = 0; $t -lt $arrTask.length; $t++)
{
Add-Member -InputObject $arrTaskObj -MemberType NoteProperty `
-Name $arrSchTasksAttributes[$t] -Value $arrTask[$t]
}
$listHeaders = @{Expression={$_.HostName};Label="Host Name"}, @{Expression={$_.TaskName};Label="Task Name"}, @{Expression={$_.NextRunTime};Label="Next Run Time"}, @{Expression={$_.LastRunTime};Label="Last Run Time"}, @{Expression={$_.LastResult};Label="Last Result"}, @{Expression={$_.Status};Label="Current Status"}
$arrTaskObj | Format-List $listHeaders
}
}
基本的に、スケジュールされたタスクリスト全体をサーバーに照会し、出力を配列として受け取ります。次に、特定のスケジュールされたタスクを含む行を出力で検索します。それが見つかると、検索されたタスクのデータ行の配列が生成されます(この時点ではヘッダー情報はありません)。次に、スケジュールされたタスクが配列として返すヘッダー情報を使用して、ヘッダー情報の各部分をプロパティとして使用してカスタムオブジェクトを構築し、特定のタスクの配列からのデータを入力します。
オブジェクトの作成方法が原因で、このスクリプトを微調整して、複数のスケジュールされたタスクを含めることができるようにすることができます。現状では、出力は$ listHeaders変数でフィルタリングされますが、それを実行して$ arrTaskObjオブジェクトをパイプに出力するだけで、のプロパティを呼び出してアクセスできるようになります。