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); }
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; }