这个问题适用于所有使用Octopus Deploy运行计划任务的人。
https://library.octopusdeploy.com/step-template/actiontemplate-windows-scheduled-task-create
是否有人遇到过必须在计划任务中指定“开始(可选):”参数的情况?
我想知道Octopus Deploy是否可行,或者是否有任何解决方法?
答案 0 :(得分:2)
Octopus部署社区步骤只是带有变量的Powershell脚本。您可以编辑Powershell以设置任何变量为"开始于"路径并将其传递给计划任务。我可以举个例子说明你需要一个。
<强>更新强>
在准确查看任务的Posh脚本之后,我认为更好的选择是为XML文件添加一个参数,用于定义任务参数并在Octopus部署步骤中设置该参数。这将为您提供最大的可修复性,以防您需要提供除&#34; Start in&#34;之外的任何其他参数。参数。
更新2
所以我写了一个自定义Step来做你想做的事情,然后查看社区提要,傻我。已有stemp模板从XML文件创建计划任务。 XML将允许您设置工作目录。步骤模板称为&#34;从XML创建计划任务&#34;你可以在http://library.octopusdeploy.com/step-templates/26c779af-4cce-447e-98bb-4741c25e0b3c/actiontemplate-create-scheduled-tasks-from-xml找到它。
此外,这是我使用自定义步骤的地方,它只是Powershell:
$ErrorActionPreference = "Stop";
Set-StrictMode -Version "Latest";
function New-ScheduledTask {
param (
[Parameter(Mandatory = $true)][hashtable] $octopusParameters
)
$arguments = @{
TaskName = $octopusParameters['TaskName']
User = $octopusParameters['RunAsUser']
}
if ($octopusParameters['RunAsPassword']) {
$arguments.Password = $runAsPassword
}
if ($octopusParameters.ContainsKey('RunWithElevatedPermissions')) {
if ([boolean]::Parse($octopusParameters['RunWithElevatedPermissions'])) {
$arguments.RunLevel = 'Highest'
}
}
switch ($octopusParameters['Schedule']) {
'Once' {
$triggerArguments.Once = $true
$triggerArguments.At = $runAt
}
'Daily' {
$triggerArguments.Daily = $true
$triggerArguments.At = $runAt
if ($interval) {
$triggerArguments.DaysInterval = $octopusParameters['Interval']
}
}
'Weekly' {
$triggerArguments.Weekly = $true
$triggerArguments.At = $runAt
if ($interval) {
$triggerArguments.WeeksInterval = $octopusParameters['Interval']
}
}
'Startup' {
$triggerArguments.AtStartup = $true
}
'Logon' {
$triggerArguments.AtLogOn = $true
}
}
$actionArguments = @{
Execute = $octopusParameters['Executable']
Argument = $octopusParameters['Arguments']
WorkingDirectory = $octopusParameters['WorkingDirectory']
}
$arguments.Action = New-ScheduledTaskAction @actionArguments
$triggerArguments = @{
TaskName = $taskName
User = $runAsUser
}
$arguments.Trigger = New-ScheduledTaskTrigger @triggerArguments
Write-Output "Creating Scheduled Task - $taskName"
Unregister-ScheduledTask -TaskName $taskName -Confirm:$false -ErrorAction:SilentlyContinue
Register-ScheduledTask @arguments | Out-Null
Write-Output "Successfully Created $taskName"
}
# only execute the step if it's called from octopus deploy,
# and skip it if we're runnning inside a Pester test
if (Test-Path -Path "Variable:octopusParameters") {
New-ScheduledTask $octopusParameters
}
答案 1 :(得分:1)
遇到相同问题后,我发现schtasks.exe没有使用“工作目录”(“开始于”(可选))参数。
我做了以下事情:
这是我在Octopus中使用的PowerShell,以XML形式获取计划任务并插入工作目录节点:
$scheduleFolder = $OctopusParameters["ScheduledTaskFolder"]
$scheduleName = $OctopusParameters["ScheduledTaskName"]
$scheduleWorkingDirectory = $OctopusParameters["ScheduledTaskWorkingDirectory"]
$scheduleXmlFileName = $OctopusParameters["ScheduledTaskXmlFileName"]
$installFolder = $OctopusParameters["InstallFolder"]
Write-Output "Connecting to Schedule Service"
$schedule = New-Object -Com("Schedule.Service")
$schedule.Connect()
Write-Output "Getting $scheduleName task in folder $scheduleFolder as xml"
$task = $schedule.GetFolder($scheduleFolder).GetTasks(0) | Where {$_.Name -eq
$scheduleName}
$xml = [xml]$task.Xml
# Parent node
$execNode = $xml.Task.Actions.Exec
# Create WorkingDirectory node
$workingDirectoryElement = $xml.CreateElement("WorkingDirectory",
$execNode.NamespaceURI)
$workingDirectoryElement.InnerText = $scheduleWorkingDirectory
# Insert the WorkingDirectory node after the last child node
Write-Output "Inserting WorkingDirectory node in $execNode.Name node"
$numberExecNodes = $execNode.ChildNodes.Count
$execNode.InsertAfter($workingDirectoryElement, $execNode.ChildNodes[$numberExecNodes
- 1])
# Output the xml to a file
Write-Output "Saving $installFolder\$scheduleXmlFileName"
$xml.Save("$installFolder\$scheduleXmlFileName")
另一种选择是将XML文件(带有工作目录节点)保存为项目的一部分,并仅使用Octopus模板(从XML创建计划任务)进行部署。
...
<Actions Context="Author">
<Exec>
<Command>"C:\Program Files\Test Application\Application.exe"</Command>
<WorkingDirectory>C:\Program Files\Test Application</WorkingDirectory>
</Exec>
</Actions>
</Task>