使用 Powershell 创建 Shedule 任务以立即执行 Powershell 脚本

使用 Powershell 创建 Shedule 任务以立即执行 Powershell 脚本

我需要使用 Powershell(PS 远程处理)以编程方式创建计划任务。

我的任务是立即执行 powershell 脚本(其他情况下执行脚本 cmd)。

$powershellcmd = (get-command powershell.exe).Definition
$upgradeWSPps1 = (Join-Path $ScriptDirectory Tests.LifeCycle.Deploy.MOSS.UpgradeWSP.ps1)

$cmdToRun = "$powershellcmd -ExecutionPolicy Bypass -WindowStyle Hidden -NoLogo -File ""$upgradeWSPps1"" "

如果您通过向 schtasks 提供 $cmdToRun 来创建计划任务,则需要对双引号使用 Windows CLI 样式转义字符和 Powershell 样式转义字符。在 Powershell 中,反引号 ` 是转义字符,但在 Windows CLI(经典 Windows shell)中,它是正斜杠。

对此有什么建议吗?有任何好的示例代码吗?

答案1

这是我用来创建运行脚本文件的任务的脚本。它是不安全因为如果您选择以用户身份注册任务,那么您将需要以纯文本形式提供他/她的密码。

function Set-PowerShellScriptTask {
param(
    $Computers,
    $Script,
    $TaskName,
    $Interval = 15,
    $User,
    $Password = "pwd",
    $Root = "Scripts"
)
process {
    $file = get-item $Script -ea Stop
    

    $action = New-ScheduledTaskAction -WorkingDirectory "D:\$Root\$($file.BaseName)"  -Execute 'Powershell.exe' -Argument "-ep Unrestricted -File D:\Scripts\$($file.BaseName)\$($file.name)"

    #from https://xplantefeve.io/posts/SchdTskOnEvent
    $class = Get-Cimclass MSFT_TaskRepetitionPattern Root/Microsoft/Windows/TaskScheduler
    $reps = New-CimInstance -CimClass $class -ClientOnly
    $reps.Interval = "PT$($Interval)M" #15 minutes
    $reps.StopAtDurationEnd = $False
    
    $triggers = @(( New-ScheduledTaskTrigger -AtLogon ),(New-ScheduledTaskTrigger -At (get-date) -RepetitionInterval (new-timespan -Minutes $Interval) -Once:$False))
    $triggers[0].Repetition = $reps
    #$triggers[0].ExecutionTimeLimit = 'PT30M' #stop if ran for more than 30 minutes
    #$triggers[0].StartBoundary = [string](get-date).AddMinutes(1).toString('O')

    $settings = New-ScheduledTaskSettingsSet -StartWhenAvailable
    
    $Computers | ForEach-Object {
        robocopy $file.DirectoryName "\\$_\D$\$Root\$($file.BaseName)"
        $sess = New-CimSession $_ -ea Stop
        $act = Get-ScheduledTask -CimSession $sess -TaskName $TaskName
        if($act) {
            Unregister-ScheduledTask -TaskName $TaskName -ea Stop
        }
        if ($User -match '^NT AUTHORITY\\') {
            Register-ScheduledTask -CimSession $sess -Action $action -Trigger $triggers -Settings $settings -TaskName $TaskName-User $User
        } else {
            Register-ScheduledTask -CimSession $sess -Action $action -Trigger $triggers -Settings $settings -TaskName $TaskName-User $User -Password $Password
        }
    }
}

}

答案2

为什么要在远程计算机上创建计划任务以立即运行脚本?只需直接在远程计算机上运行脚本即可。

Invoke-Command -ComputerName COMPUTER -ScriptBlock { COMMAND }

相关内容