 |
|
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
|
Код:
$array += New-Object PSObject -Property @{Name='Microsoft Visual C++ 2005 Redistributable'; OSBits='x86'; FileName='vcredist_x86_2005.exe'}
|
Прошу прощения, не указал что массив делаю чтобы можно было отбирать по фильтру, например
Код:
$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, большое спасибо.
Так все работает как надо.
Код:
$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
|
Цитата:
Цитата densan
массив делаю чтобы можно было отбирать по фильтру, например
Код: Выделить весь код
$array | where {$_.OSBits -eq 'x86'}
Serguei Kouzmine, при использовании хэш-таблицы фильтровать не получится. »
|
Serguei Kouzmine не предлагал отказываться от массива, а предлагал заменить объект словарём (ассоциативным массивом). В таком случае меняется синтаксис фильтрации, только и всего:
Код:
$array | where {$_['OSBits'] -eq 'x86'}
|
Время: 23:13.
© OSzone.net 2001-