1

拿这个代码:

$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

我已经尝试了所有方法,但它们都不起作用。

有人有什么想法吗?

谢谢

PS我想我可能把这个问题的标题弄错了。

4

2 回答 2

3

在您的示例中:

$logged_on_user = get-wmiobject win32_computersystem | select username

使用单个属性 - 用户名创建一个新的 PSCustomObject。当您执行以下操作时:

$A = $logged_on_user.username

您将 PSCustomObject 的用户名属性的返回值分配给变量 $A。因为用户名属性的返回类型是字符串,所以 $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 所做的所有相同的属性及其值。

因此,如果您只需要 ManagementObject 包含的属性值,则无需将输出通过管道传输到 Select-Object,因为这只会使用 MangementObject 中的值创建一个新对象(PSCustomObject 类型)。当您想要选择正在通过管道输入的对象的属性子集,或者想要创建具有通过表达式计算的不同属性的新 PSCustomObject 时,Select-Object 很有用。

于 2012-10-05T17:28:51.473 回答
0

我不确定您是否在询问Get-WmiObject一般复制 PowerShell 对象的结果。在前一种情况下,Get-WmiObject返回ManagementObject的实例,它实现了提供方法的ICloneable接口。你可以这样使用它...Clone

$computerSystem = Get-WmiObject -Class 'Win32_ComputerSystem';
$computerSystemCopy = $computerSystem.Clone();

上述代码执行后,$computerSystem$computerSystemCopy是相同但完全独立的ManagementObject实例。您可以通过运行来确认这一点...

$areSameValue = $computerSystem -eq $computerSystemCopy;
$areSameInstance = [Object]::ReferenceEquals($computerSystem, $computerSystemCopy);

...并注意到$areSameValueis$true$areSameInstanceis $false

于 2012-10-05T20:22:26.833 回答