哈希数组进入RunSpace

时间:2016-10-23 16:19:26

标签: powershell-v4.0 runspace

将数组对象从主脚本传递到RunSpace代码块时,我会遇到奇怪的行为。 我试图在RunSpace代码块中使用Where-Object语句检索值。 但是会产生与null方法有关的错误。

如果我在传递给runspace之前对数组执行相同的Where-Object语句,那么它是否有效?

例如,如果我在数组上传递给RunSpace之前执行以下操作,它可以正常工作:

$ARRAY | Where-Object {$_.object -eq $Variable}).PropertyofwhatIWant.ToString()

如果我将此数组传递给了运行空间并执行相同的操作,那么它将失败:

You cannot call a method on a null-valued expression.
At line:25 char:13
+             $strSourceGivenName = ($arr_Src_Users1 | Where-Object {$_.objectsid  ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

我比较了两个数组对象并且它们具有完全相同的属性? 检查Get-Member时,ARRAY和ARRAY1没有区别? 发生了什么事?

Module                     : CommonLanguageRuntimeLibrary
Assembly                   : mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
TypeHandle                 : System.RuntimeTypeHandle
DeclaringMethod            : 
BaseType                   : System.Array
UnderlyingSystemType       : System.Object[]
FullName                   : System.Object[]
AssemblyQualifiedName      : System.Object[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Namespace                  : System
GUID                       : 00000000-0000-0000-0000-000000000000
IsEnum                     : False
GenericParameterAttributes : 
IsSecurityCritical         : False
IsSecuritySafeCritical     : False
IsSecurityTransparent      : True
IsGenericTypeDefinition    : False
IsGenericParameter         : False
GenericParameterPosition   : 
IsGenericType              : False
IsConstructedGenericType   : False
ContainsGenericParameters  : False
StructLayoutAttribute      : 
Name                       : Object[]
MemberType                 : TypeInfo
DeclaringType              : 
ReflectedType              : 
MetadataToken              : 33554432
GenericTypeParameters      : {}
DeclaredConstructors       : {Void .ctor(Int32)}
DeclaredEvents             : {}
DeclaredFields             : {}
DeclaredMembers            : {Void Set(Int32, System.Object), System.Object& Address(Int32), System.Object Get(Int32), Void .ctor(Int32)}
DeclaredMethods            : {Void Set(Int32, System.Object), System.Object& Address(Int32), System.Object Get(Int32)}
DeclaredNestedTypes        : {}
DeclaredProperties         : {}
ImplementedInterfaces      : {System.ICloneable, System.Collections.IList, System.Collections.ICollection, System.Collections.IEnumerable...}
TypeInitializer            : 
IsNested                   : False
Attributes                 : AutoLayout, AnsiClass, Class, Public, Sealed, Serializable
IsVisible                  : True
IsNotPublic                : False
IsPublic                   : True
IsNestedPublic             : False
IsNestedPrivate            : False
IsNestedFamily             : False
IsNestedAssembly           : False
IsNestedFamANDAssem        : False
IsNestedFamORAssem         : False
IsAutoLayout               : True
IsLayoutSequential         : False
IsExplicitLayout           : False
IsClass                    : True
IsInterface                : False
IsValueType                : False
IsAbstract                 : False
IsSealed                   : True
IsSpecialName              : False
IsImport                   : False
IsSerializable             : True
IsAnsiClass                : True
IsUnicodeClass             : False
IsAutoClass                : False
IsArray                    : True
IsByRef                    : False
IsPointer                  : False
IsPrimitive                : False
IsCOMObject                : False
HasElementType             : True
IsContextful               : False
IsMarshalByRef             : False
GenericTypeArguments       : {}
CustomAttributes           : {[System.SerializableAttribute()]}

2 个答案:

答案 0 :(得分:0)

我解决了我的问题: 与Runspace无关。 它与PS处理的方式有关:TypeName:Microsoft.ActiveDirectory.Management.ADUser

所以我过滤掉了我需要的属性并创建了一个自定义对象并将其传递给我的函数: - )

答案 1 :(得分:0)

只要将Microsoft.ActiveDirectory.Management.ADUser对象传递给另一个函数,即使管道输出数组,您也可以看到所有属性,就像在主调用中一样,属性不再可用。我会更多地挖掘为什么会这样,但是现在我的解决方法效果很好