Bagaimana saya bisa mengubah tugas terjadwal yang ada menggunakan Powershell?

8

Saya sedang mengerjakan beberapa skrip otomatisasi rilis yang menggunakan Powershell untuk memperbarui tugas terjadwal yang ada yang menjalankan berbagai aplikasi. Dalam skrip saya, saya bisa mengatur Path dan Direktori Kerja aplikasi, tetapi sepertinya tidak menyimpan perubahan kembali ke tugas.

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
        }
    }
}

Sejauh ini saya belum dapat menemukan fungsi Simpan yang jelas dalam dokumentasi ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa383607(v=vs.85).aspx ). Apakah saya mengambil pendekatan yang salah di sini, dan perlu dipusingkan dengan tugas XML?

David Keaveny
sumber
Versi PowerShell apa yang Anda gunakan? Gunakan Get-Hostuntuk mencari tahu.
Colyn1337
Versi 2.0 (lihat serverfault.com/questions/666671/… untuk beberapa masalah terkait verson saya!). Jika solusi Anda bekerja dengan Powershell versi yang lebih baru yang didukung oleh Server 2008 R2 maka itu akan memberi saya "dorongan" ekstra untuk mendapatkan server ditingkatkan :-)
David Keaveny
Server 2008R2 mendukung hingga 4.0 saat ini. Lihat Persyaratan Windows PowerShell: technet.microsoft.com/en-us/library/hh847769.aspx
Davidw

Jawaban:

2

The RegisterTask metode memiliki bendera update yang akan Anda gunakan. Sesuatu seperti ini:

# 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)

Lihat artikel msdn untuk detail tentang setiap parameter.

James Santiago
sumber
Saya benar-benar berharap ini bukan satu-satunya solusi, karena saya tidak ingin menyimpan kombinasi nama pengguna / kata sandi dalam skrip rilis saya jika saya dapat membantu ...
David Keaveny
Saya percaya Anda dapat menentukan akun sistem lokal dan membiarkan kata sandi nol.
James Santiago
Tugas terjadwal saya berjalan di bawah akun layanan yang dibuat khusus, dengan akses basis data menggunakan otentikasi Windows, jadi saya masih perlu menyimpan kredensial yang ada.
David Keaveny
Hanya akun sistem yang terkenal yang dapat melewati persyaratan kata sandi sama seperti jika Anda memperbarui tugas ini secara manual. Bahkan cmdlet powershell baru memerlukan nama pengguna dan kata sandi saat menggunakan akun yang tidak dikenal. Saya kira Anda bisa meminta kata sandi selama waktu berjalan, menyimpannya sebagai string aman dalam variabel, kemudian mengaksesnya saat diperlukan sehingga hanya disimpan dalam memori saat menjalankan skrip.
James Santiago