繁体   English   中英

读取csv文件以使用Powershell和Task Scheduler COM-Object创建从事件ID触发的任务

[英]Read csv file to create tasks that trigger from an event id using powershell and Task Scheduler COM-Object

我创建了一个看起来像这样的CSV文件

序列,报告源,报告名称,报告ID,完整路径

它包含计划任务的几行配置数据。 我已经想通了使用import-csv来获取文件的内容。 现在,我想遍历文件的每一行,并将该行的所有值存储到变量中-集合($ 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/

整个过程在带有PS 2.0.-1.-1管理机的Windows 7上运行,并创建了4个具有所需参数和参数的任务。 订阅-事情有点棘手,因为我无法使用GUI来操纵事件触发器,只能编辑XML。 每个任务提供2个动作。

好了,问题看起来可能仅仅是

“如何将CSV的值存储在变量中并遍历它们?”

让我们研究一些基本的Powershell概念,以了解您应该寻找的内容。

解决的办法是。

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

好,让我们解释一下。

让我们有一个名为test.csv的csv,内部看起来像

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

当我调用Import-CSV时,它将创建一个PSObject,其属性等于标题(CSV的第一行):

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

将返回

Bill Steve

在Powershell中,我们喜欢管道| 这样做是使用$ _作为变量将上一条命令的信息移到下一条命令。 我们也喜欢被称为Alias的速记。 %{ Code Here }foreach-object简写

所以

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

从CSV获取数据并将其转换为PSObject。 然后它将管道| 到一个Foreach-Object 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。 CSV代表逗号分隔值。 您的价值观之间用半冒号隔开。

您将需要在import-Csv -Delimiter ";"的参数中定义它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

下面的代码将在代码所在的位置加载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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM