【问题标题】:Unable to create task in task scheduler using PowerShell无法使用 PowerShell 在任务计划程序中创建任务
【发布时间】:2017-07-02 17:51:35
【问题描述】:

我正在尝试使用 Powershell 在任务计划程序中创建一个任务。

$PSVersionTable.PSVersion

主要次要版本修订
----- ----- ----- --------
3 0 -1 -1

操作系统:Windows Server 2012

这是供参考的脚本:

Set-Location c:\automation

# Remove IP of host on which this script is going to run
$hostname = hostname
$private_ip = (Test-Connection $hostname -count 1).IPv4Address.IPAddressToString
(get-content .\sch_task_action.conf) | foreach-object {$_ -replace "and not net $private_ip", ""} | set-content .\sch_task_action_final.conf

# Create task schedular
$sch_task_action = Get-Content c:\automation\sch_task_action_final.conf -Raw
$sch_task_principal = New-ScheduledTaskPrincipal -UserId "LOCALSERVICE" -LogonType ServiceAccount
$sch_task_settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Days 7)
$trigger = New-ScheduledTaskTrigger -AtStartup

Register-ScheduledTask -Action $sch_task_action -Trigger $trigger -Principal $sch_task_principal -Settings $sch_task_settings -TaskName "Monitoring"

sch_task_action.conf的内容:

New-ScheduledTaskAction -Execute c:\windump\windump.exe –Argument "-i 1 -q -w e:\network-dump\Network-Traces.txt -n -C 100 -W 100 -U -n ip and not net 125.14.93.7 and not net 10.0.2.4"

当我尝试运行 PowerShell 脚本时,我收到以下错误:

Register-ScheduledTask:无法处理参数“Action”的参数转换。
无法转换值“New-ScheduledTaskAction -Execute C:\windump\windump.exe –Argument
"-i 1 -q -w E:\network-dump\Network-Traces.txt -n -C 100 -W 100 -U -n ip 而不是 net
125.14.93.7 而不是净 10.0.2.4"
” 键入“Microsoft.Management.Infrastructure.CimInstance[]”。
错误:“无法转换值”New-ScheduledTaskAction -Execute C:\windump\windump.exe
--参数 "-i 1 -q -w E:\network-dump\Network-Traces.txt -n -C 100 -W 100 -U -n ip 和
不是净 125.14.93.7 也不是净 10.0.2.4"
” 键入“Microsoft.Management.Infrastructure.CimInstance”。
错误:“指定的参数超出了有效值的范围。
参数名称:className""
在 C:\Automation\windump\win_dump.ps1:26 char:32
+ Register-ScheduledTask -Action $sch_task_action -Trigger $trigger -Principal $sc ...
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidData: (:) [Register-ScheduledTask], ParameterBindingArgumentTransformationException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,Register-ScheduledTask

注意:在脚本中,如果我将sch_task_action_final.conf(已删除所选IP)的内容直接传递给变量(如下所示)而不使用Get-Content读取文件,则脚本可以正常工作并且任务在调度程序中创建。

$sch_task_action = New-ScheduledTaskAction -Execute c:\windump\windump.exe –Argument "-i 1 -q -w e:\network-dump\Network-Traces.txt -n -C 100 -W 100 -U -n ip and not net 125.14.93.7"

我花了几个小时试图通过在线搜索来弄清楚,但无济于事。

【问题讨论】:

    标签: powershell scheduled-tasks powershell-3.0 windows-server-2012


    【解决方案1】:

    Get-Content -Raw 返回一个字符串,该字符串不被 PowerShell 解释,也不能按原样传递给参数-Action。从sch_task_action_final.conf 中删除New-ScheduledTaskAction -Execute-Argument 并更改

    $sch_task_action = Get-Content c:\automation\sch_task_action_final.conf -Raw
    

    $action, $params = (Get-Content C:\automation\sch_task_action_final.conf -Raw) -split ' ', 2
    $sch_task_action = New-ScheduledTaskAction -Execute $action -Arugment $params
    

    您也可以使用Invoke-Expression:

    $sch_task_action = Invoke-Expresssion (Get-Content c:\automation\sch_task_action_final.conf -Raw)
    

    但我不建议这样做。

    【讨论】:

    • 您的建议效果很好 Ansgar。非常感谢您的解释。 :) 顺便说一句,当我在寻找解决方案时,我也遇到了这个命令:$sch_task_action = [IO.File]::ReadAllText("C:\automation\sch_task_action_final.conf") 但这也因同样的错误而失败。知道为什么吗?
    • 因为它和Get-Content -Raw做同样的事情。
    【解决方案2】:

    您可以使用 COM-Object 创建计划任务。使用 Schedule.Service ,您可以创建它:

                    $service = new-object -ComObject("Schedule.Service")
                    # connect to the local machine.
    
                    $service.Connect()
                    $rootFolder = $service.GetFolder("\")
                    $TaskDefinition = $service.NewTask(0)
                    $TaskDefinition.RegistrationInfo.Description = "$TaskDescr"
                    $TaskDefinition.Settings.Enabled = $true
                    $TaskDefinition.Settings.AllowDemandStart = $true
                    $TaskDefinition.Settings.StartWhenAvailable = $true
                    $TaskDefinition.Settings.StopIfGoingOnBatteries=$false
                    $TaskDefinition.Settings.DisallowStartIfOnBatteries=$false
                    $TaskDefinition.Settings.MultipleInstances=2
                    $taskdefinition.Settings.WakeToRun=$true
                    $triggers = $TaskDefinition.Triggers
                    $trigger = $triggers.Create(1) # Creates a "One time" trigger
                    $trigger.StartBoundary = $TaskStartTime.ToString("yyyy-MM-dd'T'HH:mm:ss")
                    $time_interval=New-TimeSpan -Minutes $interval
                    $time_interval=$time_interval.TotalSeconds
                    $trigger.Repetition.Interval= "PT"+"$time_interval"+"S"
                    $trigger.Enabled = $true
                    $TaskDefinition.Principal.RunLevel =1
                    $Action = $TaskDefinition.Actions.Create(0)
                    $action.Path = "$TaskCommand"
                    $action.Arguments = "$TaskArg"
                    # In Task Definition,
                    #   6 indicates "the task will not execute when it is registered unless a time-based trigger causes it to execute on registration."
                    #   5 indicates "Indicates that a Local System, Local Service, or Network Service account is being used as a security context to run the task.In this case, its the SYSTEM"
                    $rootFolder.RegisterTaskDefinition("$TaskName",$TaskDefinition,6,"System",$null,5) | Out-Null
                    "Scheduled Task has been created successfully"
                    Write-Log -Message "Scheduled Task has been created successfully with the name SHA_$schedule_name" -Level Info
    

    这是供您参考的链接:Scheduled Task in PS

    希望对你有帮助。

    【讨论】:

    • 谢谢,但我实际上是在寻找 my 脚本失败的原因。
    • @Technext:我看到 Ansgar 已经给出了很好的解释......我的意思是给出另一个出路。 :)
    猜你喜欢
    • 2014-12-28
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2018-12-03
    相关资源
    最近更新 更多