Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Powershell и CLM (http://forum.oszone.net/showthread.php?t=337705)

densan 15-11-2018 09:26 2840823

Powershell и CLM
 
Здравствуйте.
Необходимо в скрипте хранить таблицу, например

Код:

Name                                            OSBits FileName
----                                            ------ --------
Microsoft Visual C++ 2005 Redistributable      x86    vcredist_x86_2005.exe
Microsoft Visual C++ 2005 Redistributable (x64) x64    vcredist_x64_2005.exe
Microsoft Visual C++ 2013 Redistributable (x64) x64    vcredist_x64_2013.exe
Microsoft Visual C++ 2013 Redistributable (x86) x86    vcredist_x86_2013.exe
Microsoft Visual C++ 2017 Redistributable (x64) x64    vcredist_x64_2017.exe
Microsoft Visual C++ 2017 Redistributable (x86) x86    vcredist_x86_2017.exe

Задаю её:
Код:

$array = @()
$array += [PSCustomObject]@{Name='Microsoft Visual C++ 2005 Redistributable'; OSBits='x86'; FileName='vcredist_x86_2005.exe'}
$array += [PSCustomObject]@{Name='Microsoft Visual C++ 2005 Redistributable (x64)'; OSBits='x64'; FileName='vcredist_x64_2005.exe'}
$array += [PSCustomObject]@{Name='Microsoft Visual C++ 2013 Redistributable (x64)'; OSBits='x64'; FileName='vcredist_x64_2013.exe'}
$array += [PSCustomObject]@{Name='Microsoft Visual C++ 2013 Redistributable (x86)'; OSBits='x86'; FileName='vcredist_x86_2013.exe'}
$array += [PSCustomObject]@{Name='Microsoft Visual C++ 2017 Redistributable (x64)'; OSBits='x64'; FileName='vcredist_x64_2017.exe'}
$array += [PSCustomObject]@{Name='Microsoft Visual C++ 2017 Redistributable (x86)'; OSBits='x86'; FileName='vcredist_x86_2017.exe'}

Но на большом количестве ПК используется CLM, включен по требованию ИБ.
Код:

PS C:\> $ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage

И при заполнении массива получаю ошибку:
Код:

PS C:\> $array = @()
PS C:\> $array += [PSCustomObject]@{Name='Microsoft Visual C++ 2005 Redistributable'; OSBits='x86'; FileName='vcredist_x86_2005.exe'}
Не удается преобразовать значение в тип "System.Management.Automation.LanguagePrimitives+InternalPSCustomObject". В этом языковом режиме поддерживаются только основные типы.
строка:1 знак:1
+ $array += [PSCustomObject]@{Name='Microsoft Visual C++ 2005 Redistrib ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : ConversionSupportedOnlyToCoreTypes

Читаю документацию по CLM и не могу придумать как создать массив.
Прошу совета.

Serguei Kouzmine 15-11-2018 09:37 2840827

@densan
а просто хеши не пробовали ?
Код:

$ExecutionContext.SessionState.LanguageMode = 'ConstrainedLanguage'

 $array = @()
 $array += @{'Name'='Microsoft Visual C++ 2005 Redistributable'; 'OSBits'='x86'; FileName='vcredist_x86_2005.exe'}
 write-output $array[0]['Name']

 Microsoft Visual C++ 2005 Redistributable


Kazun 15-11-2018 09:47 2840829

Код:

$array += New-Object PSObject -Property @{Name='Microsoft Visual C++ 2005 Redistributable'; OSBits='x86'; FileName='vcredist_x86_2005.exe'}

densan 15-11-2018 10:31 2840839

Прошу прощения, не указал что массив делаю чтобы можно было отбирать по фильтру, например
Код:

$array | where {$_.OSBits -eq 'x86'}
Name                                            OSBits FileName
----                                            ------ --------
Microsoft Visual C++ 2005 Redistributable      x86    vcredist_x86_2005.exe
Microsoft Visual C++ 2013 Redistributable (x86) x86    vcredist_x86_2013.exe
Microsoft Visual C++ 2017 Redistributable (x86) x86    vcredist_x86_2017.exe

Serguei Kouzmine, при использовании хэш-таблицы фильтровать не получится.

Kazun,
командой
Код:

$array += New-Object PSObject -Property @{Name='Microsoft Visual C++ 2005 Redistributable'; OSBits='x86'; FileName='vcredist_x86_2005.exe'}
добавляется только один элемент, при добавлении второго - получаю ошибку
Код:

$array = $null
$array += New-Object PSObject -Property @{Name='Microsoft Visual C++ 2005 Redistributable'; OSBits='x86'; FileName='vcredist_x86_2005.exe'}
$array += @{Name='Microsoft Visual C++ 2005 Redistributable'; OSBits='x86'; FileName='vcredist_x86_2005.exe-'}
Сбой вызова метода из-за отсутствия в [System.Management.Automation.PSObject] метода с именем "op_Addition".
строка:1 знак:1
+ $array += @{Name='Microsoft Visual C++ 2005 Redistributable'; OSBits= ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound


Kazun 15-11-2018 10:38 2840840

Код:

$array = @()

densan 15-11-2018 10:50 2840844

Kazun, большое спасибо.
Так все работает как надо.
Код:

$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage
$array = @()
$array += New-Object PSObject -Property @{Name='Microsoft Visual C++ 2005 Redistributable'; OSBits='x86'; FileName='vcredist_x86_2005.exe'}
$array += New-Object PSObject -Property @{Name='Microsoft Visual C++ 2005 Redistributable (x64)'; OSBits='x64'; FileName='vcredist_x64_2005.exe'}
$array

OSBits Name                                            FileName
------ ----                                            --------
x86    Microsoft Visual C++ 2005 Redistributable      vcredist_x86_2005.exe
x64    Microsoft Visual C++ 2005 Redistributable (x64) vcredist_x64_2005.exe


$array | where {$_.OSBits -eq 'x86'}

OSBits Name                                      FileName
------ ----                                      --------
x86    Microsoft Visual C++ 2005 Redistributable vcredist_x86_2005.exe


Busla 15-11-2018 12:41 2840874

Цитата:

Цитата densan
массив делаю чтобы можно было отбирать по фильтру, например
Код: Выделить весь код
$array | where {$_.OSBits -eq 'x86'}

Serguei Kouzmine, при использовании хэш-таблицы фильтровать не получится. »

Serguei Kouzmine не предлагал отказываться от массива, а предлагал заменить объект словарём (ассоциативным массивом). В таком случае меняется синтаксис фильтрации, только и всего:
Код:

$array | where {$_['OSBits'] -eq 'x86'}


Время: 23:13.

Время: 23:13.
© OSzone.net 2001-