PowerShell не может разделить значение в некоторых системах - PullRequest
2 голосов
/ 28 января 2020

Очень странная проблема. У меня есть две системы (мой рабочий стол и мой ноутбук). Оба работают под управлением Windows 10 и PowerShell 5.1. На моем настольном компьютере разделение работает без проблем, но на моем ноутбуке я получаю приведенную ниже ошибку op_Division, в которой говорится, что это объект (но в другой системе разделение работает нормально). Я пытался как-то преобразовать объект в строку, но все, что я пытался, не удалось.

Может кто-нибудь посоветовать, как я могу получить это для разделения на систему, которая выходит из строя (и почему он работает без проблем в другой системе)?

$width = (Get-WmiObject -Class Win32_DesktopMonitor | Select-Object ScreenWidth).ScreenWidth
$width = $width / 2

#####

Method invocation failed because [System.Object[]] does not contain a method named 'op_Division'.
At line:1 char:1
+ $width = $width / 2
+ ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (op_Division:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

Ответы [ 2 ]

1 голос
/ 28 января 2020

Это может произойти, потому что $width - это массив. Если вы запустите $width.PsObject, вы увидите, что значение BaseObject будет коллекцией, которая может содержать $null. Когда вы запускаете $width[0], вы можете возвращать значение $null. Вам нужно будет использовать другой индекс с вашим текущим кодом.

Однако вы можете отфильтровать значения $null с самого начала с Where.

$width = (Get-WmiObject -Class Win32_DesktopMonitor | Where ScreenWidth).ScreenWidth
$width = $width | Foreach-Object { $_ / 2 }

С вашей попыткой, по крайней мере, в моей системе $width возвращает массив.

$width.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

$width
1920
$width.PsObject | Select-Object BaseObject

BaseObject
----------
{$null, 1920}

$width[0] # Index 0 contains the $null
$width[1] # Index 1 contains the size
1920
0 голосов
/ 28 января 2020

У вас есть несколько мониторов, и Get-WMIObject возвращает массив, поэтому используйте это:

Get-WmiObject -Class Win32_DesktopMonitor | Select-Object ScreenWidth | ForEach {
  [Double]$width = [Double]$_.ScreenWidth[0]
  $width = $width / 2
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...