1

Powershell을 사용하여 작업 스케줄러에서 작업을 만들려고합니다.PowerShell을 사용하여 작업 스케줄러에서 작업을 만들 수 없습니다.

$PSVersionTable.PSVersion 

Major Minor Build Revision 
----- ----- ----- -------- 
3  0  -1  -1

OS :

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의 : 윈도우 서버 다음은 ​​2012

는 참조 스크립트의

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 스크립트를 실행하려고, I 다음 오류가 발생했습니다 :

,210
Register-ScheduledTask : Cannot process argument transformation on parameter 'Action'. 
Cannot convert value "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" 
" to type "Microsoft.Management.Infrastructure.CimInstance[]". 
Error: "Cannot convert value "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" 
" to type "Microsoft.Management.Infrastructure.CimInstance". 
Error: "Specified argument was out of the range of valid values. 
Parameter name: className"" 
At 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

참고 : Get-Content를 사용하여 파일을 읽지 않고 (아래 그림 참조) 내가 직접 변수 (선택된 IP를 제거했다) sch_task_action_final.conf의 내용을 전달하는 경우 스크립트에서, 다음 스크립트는 벌금과 작업 작동 스케줄러에서 생성됩니다.

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

나는 온라인 검색으로 알아 내려고 노력했지만 몇 시간을 소비했지만 아무 소용이 없습니다.

답변

2

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) 

하지만 난 그것을 권하고 싶지 않다.

+0

귀하의 제안은 Ansgar에서 효과가있었습니다. 설명에 감사드립니다. :) 솔루션을 찾고 있었을 때 BTW, 나는 또한이 명령을 가로 질러왔다 :'$ sch_task_action = [IO.File] :: ReadAllText ("C : \ automation \ sch_task_action_final.conf")'이 역시 실패했다. 오류. 왜 그런가? – Technext

+0

그것은'Get-Content -Raw'와 같은 일을하기 때문에. –

0

COM 개체을 사용하여 예약 된 작업을 만들 수 있습니다. Schedule.Service를 사용하여, 당신은 그것을 만들 수 있습니다 Scheduled Task in PS

는 희망이 도움이 : 여기

   $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 

는 참조 용 링크입니다.

+0

감사합니다. 그러나 실제로 _my_ 스크립트가 실패한 이유를 실제로 찾고있었습니다. – Technext

+0

@ 기술 : Ansgar가 이미 좋은 설명을 주었다는 것을 알았습니다 .... 요점은 다른 방향으로 나가는 것이 었습니다. :) –

관련 문제