Exemplo n.º 1
0
        /// <summary>
        /// Asynchronously executes a script using the current Context.
        /// </summary>
        /// <param name="script">Script to execute.</param>
        /// <returns>An InvocationResult object representing the results of the execution.</returns>
        public PSInvocationResult GetResult(string script)
        {
            if (script == null)
            {
                throw new ArgumentNullException("script");
            }

            if (_variableKeys != null)
            {
                throw new InvalidOperationException();
            }

#if PSLEGACY
            _variableKeys = LinqEmul.ToArray <object>(LinqEmul.Cast <object>(Variables.Keys));
#else
            _variableKeys = Variables.Keys.Cast <object>().ToArray();
#endif
            try
            {
                using (Runspace runspace = (Host == null) ?
                                           ((_configuration == null) ? RunspaceFactory.CreateRunspace() : RunspaceFactory.CreateRunspace(_configuration)) :
                                           ((_configuration == null) ? RunspaceFactory.CreateRunspace(Host) : RunspaceFactory.CreateRunspace(Host, _configuration)))
                {
                    if (ApartmentState.HasValue)
                    {
                        runspace.ApartmentState = ApartmentState.Value;
                    }
                    if (ThreadOptions.HasValue)
                    {
                        runspace.ThreadOptions = ThreadOptions.Value;
                    }
                    runspace.Open();

                    foreach (object key in _variableKeys)
                    {
                        string s = (key is string) ? key as string : key.ToString();
                        if (Variables[key] != null && String.Compare(s, "this", true) != 0 && String.Compare(s, "SynchronizedData", true) != 0)
                        {
                            runspace.SessionStateProxy.SetVariable(s, Variables[key]);
                        }
                    }
                    runspace.SessionStateProxy.SetVariable("this", This);
                    runspace.SessionStateProxy.SetVariable("SynchronizedData", SynchronizedData);
                    if (InitialLocation.Length > 0)
                    {
                        runspace.SessionStateProxy.Path.SetLocation(InitialLocation);
                    }

                    using (PowerShell powerShell = PowerShell.Create())
                    {
                        powerShell.Runspace = runspace;
                        return(new PSInvocationResult(script, this, powerShell, _variableKeys));
                    }
                }
            }
            finally { _variableKeys = null; }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Method which is intended for handling source <seealso cref="EventHandler{TEventArgs}"/> events.
        /// </summary>
        /// <param name="sender">Object which raised the event.</param>
        /// <param name="e">Information about the event.</param>
        public void EventHandler(object sender, TEventArgs e)
        {
#if PSLEGACY
            object[] variableKeys = LinqEmul.ToArray <object>(LinqEmul.Cast <object>(Variables.Keys));
#else
            object[] variableKeys = Variables.Keys.Cast <object>().ToArray();
#endif
            Dictionary <object, object> variables  = new Dictionary <object, object>();
            IDictionaryEnumerator       enumerator = Variables.GetEnumerator();
            try
            {
                while (enumerator.MoveNext())
                {
                    variables.Add(enumerator.Key, enumerator.Value);
                }
            }
            finally
            {
                if (enumerator is IDisposable)
                {
                    (enumerator as IDisposable).Dispose();
                }
            }
            PSHost host = Host;
            RunspaceConfiguration configuration  = Configuration;
            ApartmentState?       apartmentState = ApartmentState;
            PSThreadOptions?      threadOptions  = ThreadOptions;
            string initialLocation = InitialLocation;

            using (Runspace runspace = (host == null) ?
                                       ((configuration == null) ? RunspaceFactory.CreateRunspace() : RunspaceFactory.CreateRunspace(configuration)) :
                                       ((configuration == null) ? RunspaceFactory.CreateRunspace(host) : RunspaceFactory.CreateRunspace(host, configuration)))
            {
                if (apartmentState.HasValue)
                {
                    runspace.ApartmentState = apartmentState.Value;
                }
                if (threadOptions.HasValue)
                {
                    runspace.ThreadOptions = threadOptions.Value;
                }
                runspace.Open();

                foreach (object key in variables.Keys)
                {
                    string s = (key is string) ? key as string : key.ToString();
                    if (Variables[key] != null && String.Compare(s, "this", true) != 0 && String.Compare(s, "SynchronizedData", true) != 0)
                    {
                        runspace.SessionStateProxy.SetVariable(s, Variables[key]);
                    }
                }

                runspace.SessionStateProxy.SetVariable("this", This);
                runspace.SessionStateProxy.SetVariable("SynchronizedData", SynchronizedData);

                if (initialLocation.Length > 0)
                {
                    runspace.SessionStateProxy.Path.SetLocation(initialLocation);
                }

                using (PowerShell powerShell = PowerShell.Create())
                {
                    powerShell.Runspace = runspace;
                    RaiseEventHandlerInvoked(sender, e, new PSInvocationResult(HandlerScript.ToString(), this, powerShell, variableKeys, sender, e));
                }
            }
        }
Exemplo n.º 3
0
        internal static string GetRegexPattern(UnicodeCategory?categories, IEnumerable <char> otherChars, bool notMatch, bool noBrackets)
        {
            List <string> patterns = new List <string>();

            if (categories.HasValue)
            {
                foreach (UnicodeCategory uc in Enum.GetValues(typeof(UnicodeCategory)))
                {
                    string pattern;

                    switch (uc)
                    {
                    case UnicodeCategory.UppercaseLetter:
                        pattern = @"\p{Lu}";
                        break;

                    case UnicodeCategory.LowercaseLetter:
                        pattern = @"\p{Ll}";
                        break;

                    case UnicodeCategory.TitlecaseLetter:
                        pattern = @"\p{Lt}";
                        break;

                    case UnicodeCategory.ModifierLetter:
                        pattern = @"\p{Lm}";
                        break;

                    case UnicodeCategory.OtherLetter:
                        pattern = @"\p{Lo}";
                        break;

                    case UnicodeCategory.NonSpacingMark:
                        pattern = @"\p{Mn}";
                        break;

                    case UnicodeCategory.SpacingCombiningMark:
                        pattern = @"\p{Mc}";
                        break;

                    case UnicodeCategory.EnclosingMark:
                        pattern = @"\p{Me}";
                        break;

                    case UnicodeCategory.DecimalDigitNumber:
                        pattern = @"\p{Nd}";
                        break;

                    case UnicodeCategory.LetterNumber:
                        pattern = @"\p{Nl}";
                        break;

                    case UnicodeCategory.OtherNumber:
                        pattern = @"\p{No}";
                        break;

                    case UnicodeCategory.SpaceSeparator:
                        pattern = @"\p{Zs}";
                        break;

                    case UnicodeCategory.LineSeparator:
                        pattern = @"\p{Zl}";
                        break;

                    case UnicodeCategory.ParagraphSeparator:
                        pattern = @"\p{Zp}";
                        break;

                    case UnicodeCategory.Control:
                        pattern = @"\p{Cc}";
                        break;

                    case UnicodeCategory.Format:
                        pattern = @"\p{Cf}";
                        break;

                    case UnicodeCategory.Surrogate:
                        pattern = @"\p{Cs}";
                        break;

                    case UnicodeCategory.PrivateUse:
                        pattern = @"\p{Co}";
                        break;

                    case UnicodeCategory.ConnectorPunctuation:
                        pattern = @"\p{Pc}";
                        break;

                    case UnicodeCategory.DashPunctuation:
                        pattern = @"\p{Pd}";
                        break;

                    case UnicodeCategory.OpenPunctuation:
                        pattern = @"\p{Ps}";
                        break;

                    case UnicodeCategory.ClosePunctuation:
                        pattern = @"\p{Pe}";
                        break;

                    case UnicodeCategory.InitialQuotePunctuation:
                        pattern = @"\p{Pi}";
                        break;

                    case UnicodeCategory.FinalQuotePunctuation:
                        pattern = @"\p{Pf}";
                        break;

                    case UnicodeCategory.OtherPunctuation:
                        pattern = @"\p{Po}";
                        break;

                    case UnicodeCategory.MathSymbol:
                        pattern = @"\p{Sm}";
                        break;

                    case UnicodeCategory.CurrencySymbol:
                        pattern = @"\p{Sc}";
                        break;

                    case UnicodeCategory.ModifierSymbol:
                        pattern = @"\p{Sk}";
                        break;

                    case UnicodeCategory.OtherSymbol:
                        pattern = @"\p{So}";
                        break;

                    default:
                        pattern = @"\p{Cn}";
                        break;
                    }
                    if (!patterns.Contains(pattern))
                    {
                        patterns.Add(pattern);
                    }
                }
            }

#if PSLEGACY
            if (otherChars != null && LinqEmul.Any <char>(otherChars))
#else
            if (otherChars != null && otherChars.Any())
#endif
            {
                Regex regex;
                if (patterns.Count == 1)
                {
                    regex = new Regex(patterns[0], RegexOptions.Compiled);
                }
                else if (patterns.Count > 1)
                {
                    regex = new Regex(String.Format("[{0}]", String.Join("", patterns.ToArray())), RegexOptions.Compiled);
                }
                else
                {
                    regex = null;
                }
                if (regex == null)
                {
                    foreach (char c in otherChars)
                    {
                        int    i       = (int)c;
                        string pattern = (i > 127) ? String.Format(@"\u{0:X4}", (int)c) : Regex.Escape(new String(c, 1));
                        if (!patterns.Contains(pattern))
                        {
                            patterns.Add(pattern);
                        }
                    }
                }
                else
                {
                    foreach (char c in otherChars)
                    {
                        if (regex.IsMatch(c.ToString()))
                        {
                            continue;
                        }

                        int    i       = (int)c;
                        string pattern = (i > 127) ? String.Format(@"\u{0:X4}", (int)c) : Regex.Escape(new String(c, 1));
                        if (!patterns.Contains(pattern))
                        {
                            patterns.Add(pattern);
                        }
                    }
                }
            }

            if (notMatch)
            {
                if (noBrackets)
                {
                    return(String.Format("^{0}", String.Join("", patterns.ToArray())));
                }

                return(String.Format("[^{0}]", String.Join("", patterns.ToArray())));
            }

            if (patterns.Count == 0)
            {
                return("");
            }

            if (patterns.Count == 1)
            {
                return(patterns[0]);
            }

            if (noBrackets)
            {
                return(String.Join("", patterns.ToArray()));
            }

            return(String.Format("[{0}]", String.Join("", patterns.ToArray())));
        }