Powershell 为什么将WMI PSComputerName插入mysql数据库时会根据此用法进行更改?

Powershell 为什么将WMI PSComputerName插入mysql数据库时会根据此用法进行更改?,powershell,powershell-3.0,Powershell,Powershell 3.0,我正在编写一个脚本来执行WMI查询,从服务器获取磁盘信息,并将信息放入mysql数据库。当我执行以下代码时,我将“\servernameootcimv2:Win32\u LogicalDisk.DeviceID=“C:”.PSComputerName”放入数据库中作为computername foreach ($Server in $Servers) { $DiskInfo = get-wimobject -class Win32_LogicalDisk -ComputerName $S

我正在编写一个脚本来执行WMI查询,从服务器获取磁盘信息,并将信息放入mysql数据库。当我执行以下代码时,我将“\servernameootcimv2:Win32\u LogicalDisk.DeviceID=“C:”.PSComputerName”放入数据库中作为computername

foreach ($Server in $Servers) {
    $DiskInfo = get-wimobject -class Win32_LogicalDisk -ComputerName $Server

    foreach ($disk in $DiskInfo) {
        $command.CommandText = "INSERT INTO drives (computername) VALUES ('$disk.PSComputerName')"
        $command.ExecuteNonQuery()
    }

}
当我将$disk.PSComputerName分配给一个变量并使用该变量将代码修改为以下内容时,我在DB中只得到服务器名称的正确输出

foreach ($Server in $Servers) {
    $DiskInfo = get-wmiobject -class Win32_LogicalDisk -ComputerName $Server

    foreach ($disk in $DiskInfo) {
        $name = $disk.PSComputerName 
        $command.CommandText = "INSERT INTO drives (computername) VALUES ('$name')"
        $command.ExecuteNonQuery()
    }

}

我意识到我有一个解决方法,但我正在试图理解这种行为的区别。

在可扩展字符串中,需要使用子字符串语法-$()-来引用对象的属性

$command.CommandText = "INSERT INTO drives (computername) VALUES ('$($disk.PSComputerName)')"

否则,属性reference.PSComputerName将被解释为要附加到$disk值上的文字文本。

Powershell仅在双引号字符串中展开变量。在查询字符串中

"INSERT INTO drives (computername) VALUES ('$disk.PSComputerName')"
只有
$disk
被展开(到其
ToString()
方法的返回值),而不是属性
$disk.PSComputerName
。您需要将其放入子表达式中,以使powershell计算属性值:

"INSERT INTO drives (computername) VALUES ('$($disk.PSComputerName)')"
有关更详细的解释,请参阅