MegaBites-AI/Windows-powershell
0372
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4using System;5using System.Collections.Generic;6using System.Diagnostics.CodeAnalysis;7using System.Management.Automation;8 9namespace Microsoft.PowerShell.Commands10{11 /// <summary>12 /// Cmdlet to get available list of results.13 /// </summary>14 [Cmdlet(VerbsCommon.Get, "Job", DefaultParameterSetName = JobCmdletBase.SessionIdParameterSet, HelpUri = "https://go.microsoft.com/fwlink/?LinkID=2096582")]15 [OutputType(typeof(Job))]16 public class GetJobCommand : JobCmdletBase17 {18 #region Parameters19 20 /// <summary>21 /// IncludeChildJob parameter.22 /// </summary>23 [Parameter(ParameterSetName = JobCmdletBase.SessionIdParameterSet)]24 [Parameter(ParameterSetName = JobCmdletBase.InstanceIdParameterSet)]25 [Parameter(ParameterSetName = JobCmdletBase.NameParameterSet)]26 [Parameter(ParameterSetName = JobCmdletBase.StateParameterSet)]27 [Parameter(ParameterSetName = JobCmdletBase.CommandParameterSet)]28 public SwitchParameter IncludeChildJob { get; set; }29 30 /// <summary>31 /// ChildJobState parameter.32 /// </summary>33 [Parameter(ParameterSetName = JobCmdletBase.SessionIdParameterSet)]34 [Parameter(ParameterSetName = JobCmdletBase.InstanceIdParameterSet)]35 [Parameter(ParameterSetName = JobCmdletBase.NameParameterSet)]36 [Parameter(ParameterSetName = JobCmdletBase.StateParameterSet)]37 [Parameter(ParameterSetName = JobCmdletBase.CommandParameterSet)]38 public JobState ChildJobState { get; set; }39 40 /// <summary>41 /// HasMoreData parameter.42 /// </summary>43 [Parameter(ParameterSetName = JobCmdletBase.SessionIdParameterSet)]44 [Parameter(ParameterSetName = JobCmdletBase.InstanceIdParameterSet)]45 [Parameter(ParameterSetName = JobCmdletBase.NameParameterSet)]46 [Parameter(ParameterSetName = JobCmdletBase.StateParameterSet)]47 [Parameter(ParameterSetName = JobCmdletBase.CommandParameterSet)]48 public bool HasMoreData { get; set; }49 50 /// <summary>51 /// Before time filter.52 /// </summary>53 [Parameter(ParameterSetName = JobCmdletBase.SessionIdParameterSet)]54 [Parameter(ParameterSetName = JobCmdletBase.InstanceIdParameterSet)]55 [Parameter(ParameterSetName = JobCmdletBase.NameParameterSet)]56 [Parameter(ParameterSetName = JobCmdletBase.StateParameterSet)]57 [Parameter(ParameterSetName = JobCmdletBase.CommandParameterSet)]58 public DateTime Before { get; set; }59 60 /// <summary>61 /// After time filter.62 /// </summary>63 [Parameter(ParameterSetName = JobCmdletBase.SessionIdParameterSet)]64 [Parameter(ParameterSetName = JobCmdletBase.InstanceIdParameterSet)]65 [Parameter(ParameterSetName = JobCmdletBase.NameParameterSet)]66 [Parameter(ParameterSetName = JobCmdletBase.StateParameterSet)]67 [Parameter(ParameterSetName = JobCmdletBase.CommandParameterSet)]68 public DateTime After { get; set; }69 70 /// <summary>71 /// Newest returned count.72 /// </summary>73 [Parameter(ParameterSetName = JobCmdletBase.SessionIdParameterSet)]74 [Parameter(ParameterSetName = JobCmdletBase.InstanceIdParameterSet)]75 [Parameter(ParameterSetName = JobCmdletBase.NameParameterSet)]76 [Parameter(ParameterSetName = JobCmdletBase.StateParameterSet)]77 [Parameter(ParameterSetName = JobCmdletBase.CommandParameterSet)]78 public int Newest { get; set; }79 80 /// <summary>81 /// SessionId for which job82 /// need to be obtained.83 /// </summary>84 [Parameter(ValueFromPipelineByPropertyName = true, Position = 0,85 ParameterSetName = JobCmdletBase.SessionIdParameterSet)]86 [ValidateNotNullOrEmpty]87 [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]88 public override int[] Id89 {90 get91 {92 return base.Id;93 }94 95 set96 {97 base.Id = value;98 }99 }100 101 #endregion Parameters102 103 #region Overrides104 105 /// <summary>106 /// Extract result objects corresponding to the specified107 /// names or expressions.108 /// </summary>109 protected override void ProcessRecord()110 {111 List<Job> jobList = FindJobs();112 113 jobList.Sort(static (x, y) => x != null ? x.Id.CompareTo(y != null ? y.Id : 1) : -1);114 WriteObject(jobList, true);115 }116 117 #endregion Overrides118 119 #region Protected Members120 121 /// <summary>122 /// Helper method to find jobs based on parameter set.123 /// </summary>124 /// <returns>Matching jobs.</returns>125 protected List<Job> FindJobs()126 {127 List<Job> jobList = new List<Job>();128 129 switch (ParameterSetName)130 {131 case NameParameterSet:132 {133 jobList.AddRange(FindJobsMatchingByName(true, false, true, false));134 }135 136 break;137 138 case InstanceIdParameterSet:139 {140 jobList.AddRange(FindJobsMatchingByInstanceId(true, false, true, false));141 }142 143 break;144 145 case SessionIdParameterSet:146 {147 if (Id != null)148 {149 jobList.AddRange(FindJobsMatchingBySessionId(true, false, true, false));150 }151 else152 {153 // Get-Job with no filter.154 jobList.AddRange(JobRepository.Jobs);155 jobList.AddRange(JobManager.GetJobs(this, true, false, null));156 }157 }158 159 break;160 161 case CommandParameterSet:162 {163 jobList.AddRange(FindJobsMatchingByCommand(false));164 }165 166 break;167 168 case StateParameterSet:169 {170 jobList.AddRange(FindJobsMatchingByState(false));171 }172 173 break;174 175 case FilterParameterSet:176 {177 jobList.AddRange(FindJobsMatchingByFilter(false));178 }179 180 break;181 182 default:183 break;184 }185 186 jobList.AddRange(FindChildJobs(jobList));187 188 jobList = ApplyHasMoreDataFiltering(jobList);189 190 return ApplyTimeFiltering(jobList);191 }192 193 #endregion194 195 #region Private Members196 197 /// <summary>198 /// Filter jobs based on HasMoreData.199 /// </summary>200 /// <param name="jobList"></param>201 /// <returns>Return the list of jobs after applying HasMoreData filter.</returns>202 private List<Job> ApplyHasMoreDataFiltering(List<Job> jobList)203 {204 bool hasMoreDataParameter = MyInvocation.BoundParameters.ContainsKey(nameof(HasMoreData));205 206 if (!hasMoreDataParameter)207 {208 return jobList;209 }210 211 List<Job> matches = new List<Job>();212 213 foreach (Job job in jobList)214 {215 if (job.HasMoreData == HasMoreData)216 {217 matches.Add(job);218 }219 }220 221 return matches;222 }223 224 /// <summary>225 /// Find the all child jobs with specified ChildJobState in the job list.226 /// </summary>227 /// <param name="jobList"></param>228 /// <returns>Returns job list including all child jobs with ChildJobState or all if IncludeChildJob is specified.</returns>229 private List<Job> FindChildJobs(List<Job> jobList)230 {231 bool childJobStateParameter = MyInvocation.BoundParameters.ContainsKey(nameof(ChildJobState));232 bool includeChildJobParameter = MyInvocation.BoundParameters.ContainsKey(nameof(IncludeChildJob));233 234 List<Job> matches = new List<Job>();235 236 if (!childJobStateParameter && !includeChildJobParameter)237 {238 return matches;239 }240 241 // add all child jobs if ChildJobState is not specified242 //243 if (!childJobStateParameter && includeChildJobParameter)244 {245 foreach (Job job in jobList)246 {247 if (job.ChildJobs != null && job.ChildJobs.Count > 0)248 {249 matches.AddRange(job.ChildJobs);250 }251 }252 }253 else254 {255 foreach (Job job in jobList)256 {257 foreach (Job childJob in job.ChildJobs)258 {259 if (childJob.JobStateInfo.State != ChildJobState)260 {261 continue;262 }263 264 matches.Add(childJob);265 }266 }267 }268 269 return matches;270 }271 272 /// <summary>273 /// Applys the appropriate time filter to each job in the job list.274 /// Only Job2 type jobs can be time filtered so older Job types are skipped.275 /// </summary>276 /// <param name="jobList"></param>277 /// <returns></returns>278 private List<Job> ApplyTimeFiltering(List<Job> jobList)279 {280 bool beforeParameter = MyInvocation.BoundParameters.ContainsKey(nameof(Before));281 bool afterParameter = MyInvocation.BoundParameters.ContainsKey(nameof(After));282 bool newestParameter = MyInvocation.BoundParameters.ContainsKey(nameof(Newest));283 284 if (!beforeParameter && !afterParameter && !newestParameter)285 {286 return jobList;287 }288 289 // Apply filtering.290 List<Job> filteredJobs;291 if (beforeParameter || afterParameter)292 {293 filteredJobs = new List<Job>();294 foreach (Job job in jobList)295 {296 if (job.PSEndTime == DateTime.MinValue)297 {298 // Skip invalid dates.299 continue;300 }301 302 if (beforeParameter && afterParameter)303 {304 if (job.PSEndTime < Before &&305 job.PSEndTime > After)306 {307 filteredJobs.Add(job);308 }309 }310 else if ((beforeParameter &&311 job.PSEndTime < Before) ||312 (afterParameter &&313 job.PSEndTime > After))314 {315 filteredJobs.Add(job);316 }317 }318 }319 else320 {321 filteredJobs = jobList;322 }323 324 if (!newestParameter ||325 filteredJobs.Count == 0)326 {327 return filteredJobs;328 }329 330 //331 // Apply Newest count.332 //333 334 // Sort filtered jobs335 filteredJobs.Sort((firstJob, secondJob) =>336 {337 if (firstJob.PSEndTime > secondJob.PSEndTime)338 {339 return -1;340 }341 else if (firstJob.PSEndTime < secondJob.PSEndTime)342 {343 return 1;344 }345 else346 {347 return 0;348 }349 });350 351 List<Job> newestJobs = new List<Job>();352 int count = 0;353 foreach (Job job in filteredJobs)354 {355 if (++count > Newest)356 {357 break;358 }359 360 if (!newestJobs.Contains(job))361 {362 newestJobs.Add(job);363 }364 }365 366 return newestJobs;367 }368 369 #endregion Private Members370 }371}372 