拿这段代码:
$logged_on_user = get-wmiobject win32_computersystem | select username
如果我想将值输出到新字符串中,我会执行以下操作:
$A = $logged_on_user.username
但是,如果我执行以下操作:
$logged_on_user = get-wmiobject win32_computersystem | select *
..尝试将所有值分配给新的“对象”,是吗?:
$logged_on_user.items
$logged_on_user.value
$logged_on_user.text
$logged_on_user.propertry
我已经尝试过所有这些并且它们不起作用。
有人有任何想法吗?
由于
P.S。我想我可能错了这个问题的标题。
答案 0 :(得分:3)
在你的例子中:
$logged_on_user = get-wmiobject win32_computersystem | select username
使用单个属性 - 用户名创建一个新的PSCustomObject。执行以下操作时:
$A = $logged_on_user.username
您要将PSCustomObject的username属性的返回值赋给变量$ A.因为username属性的返回类型是字符串,所以$ A也是一个字符串。
执行以下操作时:
$cs = get-wmiobject win32_computersystem
如果您将$ cs分配给新变量,如下所示:
$newVariable = $cs
然后$ newVariable将引用$ cs所做的相同对象,因此$ cs上可访问的所有属性和方法也可以在$ newVariable上访问。
如果在将返回值分配给另一个变量时没有指定任何属性或调用对象上的任何方法,则返回值是对象本身,而不是对象属性之一的返回值或方法强>
其他信息,但与问题没有直接关系:
将get-wmiobject的输出传递给select-object时,如下所示:
$cs = get-wmiobject win32_computersystem | select-object *
变量$ cs的类型为:PSCustomObject,而不是ManagementObject(当您不管道到Select-Object时),它具有与管道传输的ManagementObject相同的所有属性及其值。< / p>
因此,如果您只想要ManagementObject包含的属性值,则不需要将输出传递给Select-Object,因为这只是使用MangementObject中的值创建一个新对象(类型为PSCustomObject)。当您想要选择正在管道输入的对象的属性的子集时,或者您想要创建具有通过表达式计算的不同属性的新PSCustomObject时,Select-Object非常有用。
答案 1 :(得分:0)
我不确定您是否要求复制Get-WmiObject
或PowerShell对象的结果。在前一种情况下,Get-WmiObject
会返回ManagementObject
class的实例,该实例会实现提供ICloneable
interface的Clone
method。你可以像这样使用它......
$computerSystem = Get-WmiObject -Class 'Win32_ComputerSystem';
$computerSystemCopy = $computerSystem.Clone();
执行上述代码后,$computerSystem
和$computerSystemCopy
将是完全相同但完全独立的ManagementObject
个实例。您可以通过运行确认...
$areSameValue = $computerSystem -eq $computerSystemCopy;
$areSameInstance = [Object]::ReferenceEquals($computerSystem, $computerSystemCopy);
...并注意到$areSameValue
为$true
且$areSameInstance
为$false
。