Team Ai
Datasetpublic

MegaBites-AI/Windows-powershell

sourceHugging Facemitupdated 6mo agoView on Hugging Face
0likes372downloads
GetJob.cs372 linesDownload Raw Back to commands
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