Войти

Показать полную графическую версию : [решено] Powershell и CLM


densan
15-11-2018, 09:26
Здравствуйте.
Необходимо в скрипте хранить таблицу, например

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 (https://blogs.msdn.microsoft.com/powershell/2017/11/02/powershell-constrained-language-mode/), включен по требованию ИБ.

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
@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
$array += New-Object PSObject -Property @{Name='Microsoft Visual C++ 2005 Redistributable'; OSBits='x86'; FileName='vcredist_x86_2005.exe'}

densan
15-11-2018, 10:31
Прошу прощения, не указал что массив делаю чтобы можно было отбирать по фильтру, например
$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
$array = @()

densan
15-11-2018, 10:50
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
массив делаю чтобы можно было отбирать по фильтру, например
Код: Выделить весь код
$array | where {$_.OSBits -eq 'x86'}

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

Serguei Kouzmine не предлагал отказываться от массива, а предлагал заменить объект словарём (ассоциативным массивом). В таком случае меняется синтаксис фильтрации, только и всего:
$array | where {$_['OSBits'] -eq 'x86'}




© OSzone.net 2001-2012