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 2015

バージョン2.0(参照serverfault.com/questions/666671/...を私verson関連の苦境のいくつかのために!)。サーバー2008 R2でサポートされている新しいバージョンのPowershellでソリューションが動作する場合、サーバーをアップグレードするための追加の "プッシュ"が得られます:-)
David Keaveny、2015

サーバー2008R2は現在、最大4.0までサポートしています。Windows PowerShellの要件を参照してください:technet.microsoft.com/en-us/library/hh847769.aspx
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 '19 / 02/19

ローカルシステムアカウントを指定し、パスワードをnullのままにできると思います。
James Santiago、

スケジュールされたタスクは、特別に作成されたサービスアカウントで実行され、Windows認証を使用したデータベースアクセスがあるため、既存の資格情報を保持する必要があります。
David Keaveny、

これらのタスクを手動で更新する場合と同じように、よく知られたシステムアカウントのみがパスワード要件をスキップできます。よく知られていないアカウントを使用する場合、新しいpowershellコマンドレットでもユーザー名とパスワードが必要です。実行時にパスワードの入力を求め、セキュリティで保護された文字列として変数に格納し、必要なときにアクセスして、スクリプトの実行時にのみメモリに格納されるようにできると思います。
James Santiago、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.