Add-CMTaskSequenceStep
Add a step or group to a task sequence.
Syntax
Add-CMTaskSequenceStep
[-InsertStepStartIndex <UInt32>]
-Step <IResultObject[]>
-InputObject <IResultObject>
[-DisableWildcardHandling]
[-ForceWildcardHandling]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Add-CMTaskSequenceStep
[-InsertStepStartIndex <UInt32>]
-Step <IResultObject[]>
-TaskSequenceId <String>
[-DisableWildcardHandling]
[-ForceWildcardHandling]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Add-CMTaskSequenceStep
[-InsertStepStartIndex <UInt32>]
-Step <IResultObject[]>
-TaskSequenceName <String>
[-DisableWildcardHandling]
[-ForceWildcardHandling]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Description
Use this cmdlet to add a group or step to an existing task sequence. For more information about task sequences steps, see Task sequence steps.
When programmatically adding steps to a task sequence, it's important to understand the index order of steps. To help visualize the index, this article uses the following example task sequence:
- step1
- step2
- step3
- step4
- group5
- step5.1
- step5.2
- step5.3
- group5.4
- step5.4.1
- step5.5
- step6
When you use the task sequence editor to add a step, the new step is added after the currently selected step. This cmdlet works similarly, it adds the step after the specified index. You use the InsertStepStartIndex parameter to specify the step index.
This cmdlet can only add steps to the main level of the task sequence, not in groups. To add steps in groups, use Set-CMTaskSequenceGroup. For example, with the sample task sequence, if you use Add-CMTaskSequenceStep with the InsertStepStartIndex parameter value 5
, the cmdlet adds the new step after group5 and before step6.
Note
Run Configuration Manager cmdlets from the Configuration Manager site drive, for example PS XYZ:\>
. For more information, see getting started.
Examples
Example 1: Create a custom task sequence that runs two PowerShell scripts
In this example, the first two commands use the New-CMTaskSequenceStepRunPowerShellScript cmdlet to create step objects for the Run Powershell Script step. The third command creates a new custom task sequence named Run scripts. The fourth command passes the new task sequence object through the pipeline to Add-CMTaskSequenceStep, which adds the two steps.
$step1 = New-CMTaskSequenceStepRunPowerShellScript -Name "Run script 1" -PackageID $PackageId -ScriptName "script1.ps1" -ExecutionPolicy Bypass
$step2 = New-CMTaskSequenceStepRunPowerShellScript -Name "Run script 2" -PackageID $PackageId -ScriptName "script2.ps1" -ExecutionPolicy Bypass
$ts = New-CMTaskSequence -Name "Run scripts" -CustomTaskSequence
$ts | Add-CMTaskSequenceStep -Step ($step1, $step2)
The resulting task sequence looks like the following list:
- Run script 1
- Run script 2
The steps are ordered this way because of how they're ordered in the Step parameter.
Example 2: Create a custom task sequence that runs two PowerShell scripts with a different order
This example is similar to Example 1, except it uses two instances of the Add-CMTaskSequenceStep cmdlet.
$step1 = New-CMTaskSequenceStepRunPowerShellScript -Name "Run script 1" -PackageID $PackageId -ScriptName "script1.ps1" -ExecutionPolicy Bypass
$step2 = New-CMTaskSequenceStepRunPowerShellScript -Name "Run script 2" -PackageID $PackageId -ScriptName "script2.ps1" -ExecutionPolicy Bypass
$ts = New-CMTaskSequence -Name "Run scripts" -CustomTaskSequence
$ts | Add-CMTaskSequenceStep -Step $step1
$ts | Add-CMTaskSequenceStep -Step $step2
The resulting task sequence looks like the following list:
- Run script 2
- Run script 1
Because of how each instance of Add-CMTaskSequenceStep is ordered, and neither uses the InsertStepStartIndex parameter, by default they use index 0
. So the cmdlet adds the second step before the first step.
Example 3: Add a step at a specific index
This example first uses the New-CMTSStepSetVariable cmdlet to create a step object for the Set Task Sequence Variable step. It then adds this step to the task sequence named ts1 after the step at index 2. Using the example task sequence in the Description, this command adds newStep in between step2 and step3.
$step = New-CMTSStepSetVariable -name "newStep" -TaskSequenceVariable "testVar" -TaskSequenceVariableValue "testValue"
Add-CMTaskSequenceStep -TaskSequenceName "ts1" -Step $step -InsertStepStartIndex 2
Example 4: Copy a task sequence and add a new step
This example copies an existing task sequence, and then renames it. The next set of steps reconfigures the security scope. It then gets the ID for a package, and copies a condition object from another step. In the last group, it creates a new Run Command Line step that uses the package and condition objects. It then adds the new step to the new task sequence at index 11.
$ts = Copy-CMTaskSequence -Name "Deploy Windows 10 (v1)"
$ts | Set-CMTaskSequence -NewName "Deploy Windows 10 (v2)"
$ts | Add-CMObjectSecurityScope -Name "Contoso main" | Out-Null
$ts | Remove-CMObjectSecurityScope -Name "Default" -Force |Out-Null
$pkgId = (Get-CMPackage -Name "Widget tool" -Fast).PackageID
$condition = ($ts | Get-CMTaskSequenceStep -StepName "Restart in Windows PE").Condition.Operands
$step = New-CMTaskSequenceStepRunCommandLine -CommandLine "widget.exe /q" -PackageId $pkgId -Name "Install Widget in Windows PE" -Condition $condition
$ts | Add-CMTaskSequenceStep -Step $step -InsertStepStartIndex 11
Parameters
-Confirm
Prompts you for confirmation before running the cmdlet.
Type: | SwitchParameter |
Aliases: | cf |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-DisableWildcardHandling
This parameter treats wildcard characters as literal character values. You can't combine it with ForceWildcardHandling.
Type: | SwitchParameter |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-ForceWildcardHandling
This parameter processes wildcard characters and may lead to unexpected behavior (not recommended). You can't combine it with DisableWildcardHandling.
Type: | SwitchParameter |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-InputObject
Specify a task sequence object to which the cmdlet adds the step. To get this object, use the Get-CMTaskSequence, Copy-CMTaskSequence, or New-CMTaskSequence cmdlets.
Type: | IResultObject |
Aliases: | TaskSequence |
Position: | Named |
Default value: | None |
Required: | True |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-InsertStepStartIndex
Specify an integer value for the task sequence index. The cmdlet adds the new step after this specified index. For example, using the example task sequence in the Description, if you specify a value of 4
, the cmdlet adds the new step after step4.
If you specify a value of 0
, the cmdlet adds the new step at the top of the task sequence. This behavior is the default if you don't specify this parameter. For example, the cmdlet adds the new step before step1.
There's no maximum value. If you specify a value that's greater than the last step's index, the cmdlet adds the new step at the end of the task sequence. For example, if you specify a value of 10
, the cmdlet adds the new step after step6.
Type: | UInt32 |
Aliases: | InsertStepsStartIndex |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Step
Specify one or more step objects to add to the task sequence. To get this object, use one of the New-CMTSStep* cmdlets. For example, Get-CMTSStepApplyDataImage.
Type: | IResultObject[] |
Aliases: | Steps |
Position: | Named |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-TaskSequenceId
Specify the ID of a task sequence to which the cmdlet adds the step. This ID is the task sequence package ID, for example XYZ00861
.
Type: | String |
Aliases: | Id, TaskSequencePackageId |
Position: | Named |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-TaskSequenceName
Specify the name of a task sequence to which the cmdlet adds the step.
Type: | String |
Position: | Named |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-WhatIf
Shows what would happen if the cmdlet runs. The cmdlet doesn't run.
Type: | SwitchParameter |
Aliases: | wi |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Inputs
Microsoft.ConfigurationManagement.ManagementProvider.IResultObject
Outputs
System.Object
Notes
While not listed in the related links section, you can use the Get-CMTSStep*, New-CMTSStep*, Remove-CMTSStep*, and Set-CMTSStep* cmdlets. For example:
- Get-CMTSStepApplyDataImage
- New-CMTSStepApplyDataImage
- Remove-CMTSStepApplyDataImage
- Set-CMTSStepApplyDataImage
There's a set of these cmdlets for each task sequence step.