Esempio n. 1
0
        private object GetNodeChildrenDynamicParameters(string methodName, SHiPSDirectory node)
        {
            var errors = new ConcurrentBag <ErrorRecord>();

            var parameters = PSScriptRunner.CallPowerShellScript(
                node,
                null,
                _drive.PowerShellInstance,
                null,
                methodName,
                PSScriptRunner.output_DataAdded,
                (sender, e) => PSScriptRunner.error_DataAdded(sender, e, errors));

            if (errors.WhereNotNull().Any())
            {
                var error   = errors.FirstOrDefault();
                var message = Environment.NewLine;
                message += error.ErrorDetails == null ? error.Exception.Message : error.ErrorDetails.Message;
                throw new InvalidDataException(message);
            }

            return(parameters != null?parameters.FirstOrDefault() : null);
        }
Esempio n. 2
0
        private void InitializeRoot()
        {
            // Module.Type
            Match match = ModuleAndTypeRegex.Match(_rootInfo);

            if (!match.Success)
            {
                // Handling a case like: myModule#Test\FamilyTree#Austin
                match = TryExcludeFQProviderPath(_rootInfo);
                if (match == null)
                {
                    _provider.ThrowError(Resources.Resource.InvalidRootFormat.StringFormat(_rootInfo), ErrorId.InvalidRootFormat);
                    return;
                }
            }

            //first we need to make sure the module is loaded
            var moduleCommand = "import-module {0}; get-module {0} -verbose".StringFormat(match.Groups[1],
                                                                                          match.Groups[1]);

            _provider.WriteVerbose(moduleCommand);


            //get the module
            var module = _provider.SessionState.InvokeCommand.InvokeScript(moduleCommand, null).FirstOrDefault();

            if (module == null || !(module.BaseObject is PSModuleInfo))
            {
                // The reason that not using _provider.WriteError() here is because it is not terminatoring process
                // at this time, mearning the drive is actually gets created but not usable.
                //_provider.WriteError()
                _provider.ThrowError(Resources.Resource.CannotGetModule.StringFormat(match.Groups[1]), ErrorId.CannotGetModule);
                return;
            }

            //create powershell instance and load the modules currently referenced
            var moduleBaseObj = (PSModuleInfo)module.BaseObject;
            var modulePath    = Path.Combine((moduleBaseObj).ModuleBase, (moduleBaseObj).Name.TrimEnd() + ".psd1");

            if (!File.Exists(modulePath))
            {
                _provider.WriteWarning(Resources.Resource.FileNotExist.StringFormat(modulePath));
                modulePath = moduleBaseObj.Path;
                _provider.WriteWarning(Resources.Resource.Trying.StringFormat(modulePath));
            }

            _provider.WriteVerbose(modulePath);

            //create the instance of root module
            var createRootInstance = string.Format(CultureInfo.InvariantCulture,
                                                   @"using module '{0}'; $mod=get-module {1}; &($mod){{[{2}]::new('{2}')}}", modulePath, match.Groups[1], match.Groups[2]);

            _provider.WriteVerbose(createRootInstance);

            //ifdef #newrunspace
            PowerShellInstance = CreatePowerShellObject(_provider.Host, modulePath);
            PowerShellInstance.AddScript(createRootInstance);

            var errors = new ConcurrentBag <ErrorRecord>();

            var rootPsObject = PSScriptRunner.CallPowerShellScript(createRootInstance, PowerShellInstance, (sender, e) => PSScriptRunner.error_DataAdded(sender, e, errors));

            //var rootPsObject = PowerShellInstance.Invoke().FirstOrDefault();
            if (rootPsObject == null || !rootPsObject.Any())
            {
                var message = Resources.Resource.CannotCreateInstance.StringFormat(match.Groups[2], modulePath, match.Groups[2], match.Groups[2]);
                if (errors.WhereNotNull().Any())
                {
                    var error = errors.FirstOrDefault();
                    message += Environment.NewLine;
                    message += error.ErrorDetails == null ? error.Exception.Message : error.ErrorDetails.Message;
                }

                _provider.ThrowError(message, ErrorId.CannotCreateInstance);

                return;
            }

            var node = rootPsObject.FirstOrDefault().ToNode();

            if (node == null)
            {
                _provider.ThrowError(Resources.Resource.InvalidRootNode, ErrorId.NotContainerNode);
            }

            if (string.IsNullOrWhiteSpace(node.Name))
            {
                _provider.ThrowError(Resources.Resource.NameWithNullOrEmpty.StringFormat(string.IsNullOrWhiteSpace(node.Name) ? "root" : node.Name), ErrorId.NodeNameIsNullOrEmpty);
            }

            if (node.IsLeaf)
            {
                _provider.ThrowError(Resources.Resource.InvalidRootNodeType.StringFormat(Constants.Leaf), ErrorId.RootNodeTypeMustBeContainer);
            }

            RootNode = node;

            RootPathNode = new ContainerNodeService(this, node, null);

            // Getting the Get-ChildItem default parameters before running any commands. It will be used for checking
            // whether a user is passing in any dynamic parameters.
            _getChildItemDefaultParameters = GetChildItemDefaultParameters;
        }