Прочитайте CSV-файл, чтобы создать задачи, которые запускаются из идентификатора события, используя powershell и COM-объект планировщика задач. - PullRequest
0 голосов
/ 11 октября 2018

Я создал CSV-файл, который выглядит следующим образом:

последовательность, источник отчетов, имя отчета, отчет, полный путь

Он содержит несколько строк данных конфигурации для запланированных задач.Я уже понял, использовать import-csv для получения содержимого файла.Теперь я хочу пройтись по каждой строке файла и сохранить все значения строки в переменных - collection ($ sequence, $ reportsource, $ reportname, $ reportid, $ fullpath), чтобы я мог создавать запланированные задачи с этими значениями,но я не знаю, как получить доступ к объекту, который обеспечивает import-csv.Мне нужны эти значения из csv для передачи аргументов в schtasks.exe для создания моих задач.

$path = "C:\Workspace\macros\FullReportPathMR.csv"
$PSVersionTable.PSVersion

$csv = Import-CSV -Path $path -Delimiter ";" | %{

##SCHTASKS /Create /TN $($_.reportname) /sc monthly /tr "C:\Program Files (x86)\Microsoft Office###\Office14\EXCEL.EXE"
#New-ScheduledTaskAction -Execute "C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE" -Argument #"$($_.fullpath)"
#}

# The name of the scheduled task
[string]$TaskName = "$($_.reportsource) - $($_.reportname) - $($_.reportid)"
# The description of the task
[string]$TaskDescr = "Hello, it's you again! I am $($_.reportname) and I will get started, when Report ID $($_.reportid) is fired. Have a nice day!"
# The Task Action command
$TaskCommand0 = "kill.cmd"
$TaskCommand1 = "`"C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE`""

# The Task Action command argument
$TaskArg = "hallelujah"
$TaskArg1 = "$($_.fullpath)"
# attach the Task Scheduler com object
$service = new-object -ComObject("Schedule.Service")
# connect to the local machine. 
# http://msdn.microsoft.com/en-us/library/windows/desktop/aa381833(v=vs.85).aspx
$service.Connect()
$rootFolder = $service.GetFolder("\")

$TaskDefinition = $service.NewTask(0) 
$TaskDefinition.RegistrationInfo.Description = "$TaskDescr"
$TaskDefinition.Settings.Enabled = $true
$TaskDefinition.Settings.AllowDemandStart = $true

$triggers = $TaskDefinition.Triggers
#http://msdn.microsoft.com/en-us/library/windows/desktop/aa383915(v=vs.85).aspx
$trigger = $triggers.Create(0) # Creates an "On an event" trigger
$trigger.Subscription = "<QueryList><Query Id='0'><Select Path='Application'>*[System[Provider[@Name='$($_.reportsource)'] and EventID='$($_.reportid)']]</Select></Query></QueryList>"

# http://msdn.microsoft.com/en-us/library/windows/desktop/aa381841(v=vs.85).aspx
$Action = $TaskDefinition.Actions.Create(0)
$action.Path = "$TaskCommand0"
$action.Arguments = "$TaskArg"
$Action = $TaskDefinition.Actions.Create(0)
$action.Path = "$TaskCommand1"
$action.Arguments = "$TaskArg1"

#http://msdn.microsoft.com/en-us/library/windows/desktop/aa381365(v=vs.85).aspx
$rootFolder.RegisterTaskDefinition("$TaskName",$TaskDefinition,6,"System",$null,5)

Write-Host $($_.sequence) $($_.reportsource) $($_.reportname) $($_.reportid) $($_.fullpath) "task created successfully."

}

Файл CSV содержит

sequence;reportsource;reportname;reportid;fullpath
1;Monthly Report;MR1;3;C:\Workspace\macros\1.txt
2;Monthly Report;MR2;6;C:\Workspace\macros\2.txt
3;Monthly Report;MR3;9;C:\Workspace\macros\3.txt
4;Monthly Report;MR4;12;C:\Workspace\macros\4.txt

https://www.verboon.info/2013/12/powershell-creating-scheduled-tasks-with-powershell-version-3/

https://community.spiceworks.com/topic/1028906-trigger-schedule-task-on-an-eventid

https://powershell.org/forums/topic/scheduled-task-with-multiple-actions/

Все это прошло на Windows 7 с машиной администрирования PS 2.0.-1.-1 и создало 4 задачи с нужными параметрами и аргументами.Подписка - вещь немного сложная, так как я не могу манипулировать триггером событий, используя графический интерфейс, просто редактируя XML.Каждое задание предусматривает 2 действия.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

ОК, вопрос выглядит так, как будто он может быть просто

«Как сохранить значения CSV в переменной и просмотреть их?»

Давайте рассмотрим некоторые базовые Powershellконцепции, чтобы понять, что вы должны искать.

Решение есть.

Import-Csv -Path "C:\Test.csv" | %{
    Put Code Here
}

Хорошо, давайте объясним это.

Давайте представим, что у нас есть csv с именем test.csv, и внутренняя часть выглядит как

"FirstName","LastName","Age" "Bill","Boxer","52" "Steve","Nix","21"

Когда я вызываю Import-CSV, он создает объект PSObject со свойствами, которыеравно заголовку (первая строка CSV):

(Import-csv "C:\Test.csv").FirstName

вернет

Bill Steve

В PowerShell мы любим трубопровод | То, что это делает, берет информацию для предыдущей команды и перемещает ее к следующей команде, используя $ _ в качестве переменной.Мы также любим стенографию, известную как псевдоним.Например, %{ Code Here } - это короткая рука для foreach-object

, поэтому

Import-csv "C:\Test.csv" | %{
    "My Name Is $($_.FirstName) $($_.LastName) and I am $($_.Age) years old"
}

Получит данные из CSV и преобразует их в объект PSObject.Затем он передаст | в Foreach-объект aka % {} , а затем отобразит строку:

My Name Is Bill Boxer and I am 52 years old My Name Is Steve Nix and I am 21 years old

Заметьте, что $ () внутри кавычек называется выражением "$ (здесь код)". Позволяет вам вывести код внутри строки.

"Hello $_.FirstName"

Показывает все в переменной $ _ затем добавьте .FirstName в его конец, например:

@{FirstName=Bill; LastName=Boxer; Age=52}.FirstName

Но когда вы добавите выражение $ () Вы говорите, запустите эту часть как код.

"Hello $($_.FirstName)"

Показывает

Hello Bill

Итак, давайте посмотрим на код, который вы опубликовали в комментариях (Пожалуйста, продолжайтеИмейте в виду, чтобы отредактировать свое сообщение и опубликовать его там, чтобы другие могли его прочитать.

Исходя из того, что я опубликовал выше, проблема заключается в том, что ваш CSV не является CSV.разделенные полуколониями.

Вам необходимо определить это в параметре для import-Csv -Delimiter ";"

Рабочий скрипт будет выглядеть так:

$path = "C:\Workspace\macros\FullReportPathMR.csv"
Import-CSV -Path $path -Delimiter ";" | %{
    "$($_.sequence) $($_.reportsource) $($_.reportname) $($_.reportid) $($_.fullpath)"
}

вывод

1 Monthly Report MR1 3 C:\Workspace\macros\1.txt 2 Monthly Report MR2 6 C:\Workspace\macros\2.txt 3 Monthly Report MR3 9 C:\Workspace\macros\3.txt 4 Monthly Report MR4 12 C:\Workspace\macros\4.txt

0 голосов
/ 11 октября 2018

Приведенный ниже код загрузит CSV, в котором расположен код.Затем он зациклится внутри файла и создаст задание по расписанию.Этот сценарий требует прав администратора для создания новой запланированной задачи, и он будет создавать задачу в качестве текущего пользователя.

# get scripth path location
$scriptpath = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition

# import CSV
$csvdata = Import-Csv "$scriptpath\t.csv"

# this will clycle throught the data inside the object $csvdata
foreach ($result in $csvdata) {
    # to access the data just refer to object $result.[columns names inside CSV]

    # Build task info
    $action  = New-ScheduledTaskAction -Execute "$($result.fullpath)" -Argument 'case there is any argument'
    $trigger = New-ScheduledTaskTrigger -Daily -At 9am 
    Register-ScheduledTask -Action $action -Trigger $trigger -TaskName $($result.reportname) -Description $($result.reportname)
    # create the task scheduler
    New-ScheduledTaskAction -Execute 
}

Часть создания задачи была основана на: https://blogs.technet.microsoft.com/heyscriptingguy/2015/01/13/use-powershell-to-create-scheduled-tasks/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...