Powershell을 사용하여 기존 예약 된 작업을 수정하려면 어떻게해야합니까?


8

Powershell을 사용하여 다양한 응용 프로그램을 실행하는 기존 예약 작업을 업데이트하는 일부 릴리스 자동화 스크립트를 작성 중입니다. 내 스크립트에서 응용 프로그램의 경로 및 작업 디렉토리를 설정할 수 있지만 변경 내용을 다시 작업에 저장하지 않는 것 같습니다.

function CreateOrUpdateTaskRunner {
    param (
        [Parameter(Mandatory = $TRUE, Position = 1)][string]$PackageName,
        [Parameter(Mandatory = $TRUE, Position = 2)][Version]$Version,
        [Parameter(Mandatory = $TRUE, Position = 3)][string]$ReleaseDirectory
    )

    $taskScheduler = New-Object -ComObject Schedule.Service
    $taskScheduler.Connect("localhost")
    $taskFolder = $taskScheduler.GetFolder('\')

    foreach ($task in $taskFolder.GetTasks(0)) {

        # Check each action to see if it references the current package
        foreach ($action in $task.Definition.Actions) {

            # Ignore actions that do not execute code (e.g. send email, show message)
            if ($action.Type -ne 0) {
                continue
            }

            # Ignore actions that do not execute the specified task runner
            if ($action.WorkingDirectory -NotMatch $application) {
                continue
            }

            # Find the executable
            $path = Join-Path $ReleaseDirectory -ChildPath $application | Join-Path -ChildPath $Version
            $exe = Get-ChildItem $path -Filter "*.exe" | Select -First 1

            # Update the action with the new working directory and executable
            $action.WorkingDirectory = $exe.DirectoryName
            $action.Path = $exe.FullName
        }
    }
}

지금까지 설명서에서 명백한 저장 기능을 찾을 수 없었습니다 ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa383607(v=vs.85).aspx ). 여기에 잘못된 접근 방식을 취하고 있으며 작업 XML로 혼란스러워해야합니까?


어떤 버전의 powershell을 사용하고 있습니까? Get-Host알아 내기 위해 사용하십시오 .
Colyn1337

버전 2.0 ( 내 버슨 관련 문제에 대해서는 serverfault.com/questions/666671/… 참조 ). 솔루션은 서버에서 지원하는 파워 쉘의 이후 버전과 함께 작동하는 경우 2008 R2는 그 날 서버가 :-) 업그레이드 얻을 수있는 여분의 "푸시"줄 것이다
데이비드 Keaveny

Server 2008R2는 현재 최대 4.0을 지원합니다. Windows PowerShell 요구 사항 참조
Davidw

답변:


2

RegisterTask의 방법은 사용하는 것 업데이트 플래그를 가지고있다. 이 같은:

# Update the action with the new working directory and executable
$action.WorkingDirectory = $exe.DirectoryName
$action.Path = $exe.FullName

#Update Task
$taskFolder.RegisterTask($task.Name, $task.Definition, 4, "<username>", "<password>", 1, $null)

각 매개 변수에 대한 자세한 내용은 msdn 기사를 참조하십시오.


도움이 될 경우 릴리스 스크립트에 사용자 이름 / 암호 조합을 저장하고 싶지 않기 때문에 이것이 이것이 유일한 해결책이 아니기를 바랍니다.
David Keaveny

로컬 시스템 계정을 지정하고 암호를 null로 남겨 둘 수 있다고 생각합니다.
James Santiago

예약 된 작업은 Windows 인증을 사용하여 데이터베이스에 액세스하여 특별히 만들어진 서비스 계정으로 실행되므로 기존 자격 증명을 계속 유지해야합니다.
David Keaveny

잘 알려진 시스템 계정 만이 작업을 수동으로 업데이트하는 것과 동일한 암호 요구 사항을 건너 뜁니다. 잘 알려지지 않은 계정을 사용하는 경우 새로운 powershell cmdlet에도 사용자 이름과 암호가 필요합니다. 런타임 동안 암호를 묻고 변수에 보안 문자열로 저장 한 다음 필요할 때 액세스하여 스크립트를 실행할 때 메모리에만 저장되도록 할 수 있다고 가정합니다.
제임스 산티아고
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.