首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检索和更改位于另一个对象中的对象的数据

检索和更改位于另一个对象中的对象的数据
EN

Stack Overflow用户
提问于 2021-05-02 18:44:31
回答 1查看 149关注 0票数 1

按值或引用传递: powershell

更多信息:PSVersion 5.1.19041.906

所有文件都可以在这里找到:*

我想尝试通过引用传递一个对象,变量。在这个对象中,我想传递一堆信息(包含不同的其他变量/数据)。有时需要通过return $menuObjts返回它(一个变量)。

在段落'INFO‘中显示的是$menuObjts$menuObjts[‘MENUS’]

关于这些对象的更多信息,我已经尝试用gettype().fullname来找出它。

备注:在这里的代码中,我使用了$global:来允许访问和更改变量,并能够制作一个屏幕快照并用于测试目的。

因此,我的问题是在ACCESSCHANCE值中使用$menuObjts[‘MENUS’],这是$menuObjts的一个组成部分。

感谢圣地亚哥·斯夸尔宗的耐心和快速反应。其思想是从CSV文件动态创建菜单(什么工作),并通过名称- $menus_.FUNCTION调用所选的函数,这些函数将被检索。但现在我想要扩展它,并能够创建多个子菜单。

有两个独立的MENU_GRP元素:

  • $menuObjts.MENU_GRP --包含当前/活动/选定的信息
  • ($menuObjts.**MENUS** | Where-Object {[int]**$($_).MENU_GRP** -eq ... -- $menuObjts.MENUS:包含所有可定位菜单(CSV)

因此,我通过CSV文件导入了一个范围菜单项。因此,这些$menus_被添加到$menuObjts.MENUS / $menuObjts[‘MENUS’]中,$menus_中还有其他特性,如MENUPARENTMENU_GRPMENU_IDXMENU_OFFSETMENU_SEL_TYPEnrElemsFUNCTIONinfostatusd40、RESTART、d42。

代码语言:javascript
复制
$global:menus_ = Import-Csv -Delimiter "," $($curPath)
$menuGRP_ = 0      # 0 - MAIN
$menus_.MENU
$nrRestarts = @($menus_ | Where-Object { [int]$_.RESTART -eq 1 -and [int]$_.MENU_GRP -eq 0 }).Count
write-host (" info     : - nrRestarts: {0}" -f ($nrRestarts))
# SET : values in one object : $menuObjts
$global:menuObjts =[ordered]@{
    MENUS         = $menus_;
    MENU_GRP      = $menuGRP_;
    MENU_SEL_TYPE = $null;
    MENU_OFFSET   = $null;
    nrElems       = $null;
    sel_input     = $null;
    MENU_IDX      = $null}
  • $menuObjts.MENUS?MENU_GRP = 0或$menuObjts.MENUS?MENU_GRP = 6
  • $menuObjts.MENUS?MENU_OFFSET = -1或$menuObjts.MENUS?MENU_OFFSET = 12
  • $menuObjts.MENUS?nrElems = 13或$menuObjts.MENUS?nrElems = 4

$menuObjts.MENUS ? - ?,因为我不知道如何检索底层对象及其特性/数据

因此,我的问题是如何在$menus_中再次检索$menuObjts.MENUS中的每个元素。其思想是,通过一个变量,将计算下一个变量(*参见函数updateMenuObjtsInfo )

所以我的问题是如何按类型查看,如何获取通缉的数据.

  • 变量/对象Get-Variable信息

  • gettype()

$menuObjts

$menuObjts.MENUS

$menuObjts.MENUS | select -first 1

这些是我想要实现的一些事情,但这不能正常工作($_).MENU_GRP

代码语言:javascript
复制
  $1stElementGrp_         = $($menus_ | Where { [int]$($_).MENU_GRP -eq $menuObjts.MENU_GRP }| Select -First 1 )
  $menuOFFSET_            = $($1stElementGrp_).MENU_OFFSET
  $menuNrElems_           = $($1stElementGrp_).nrElems
  #####                                         where $($menuObjts.MENUS).MENU_GRP -eq $menuObjts.MENU_GRP  -> .MENU_OFFSET
  $menuObjts.MENU_OFFSET = $($menuObjts.MENUS | Where-Object { [int]$($_).MENU_GRP -eq $menuObjts.MENU_GRP}| Select -First 1 ).MENU_OFFSET
  $menuObjts.nrElems     = @($menuObjts.MENUS | Where-Object { [int]$($_).MENU_GRP -eq $menuObjts.MENU_GRP -and [int]$($_).SEL -eq 1}).Count

…的另一个想法正在添加方法,但我对Powershell的(一点点)知识还在苦苦挣扎。(基于创建PowerShell对象的4种方法 )

代码语言:javascript
复制
$menuObjts | Add-Member -MemberType ScriptMethod -Name "getMENUS_RESTART" -Value $( this.MENUS | Where-Object { [int]$_.RESTART -eq 1 -and [int]$_.MENU_GRP -eq $menuGRP_ })

信息- $menuObjts:

代码语言:javascript
复制
Name                           Value
----                           -----
MENUS                          {@{MENU;PARENT;MENU_GRP;MENU_IDX;MENU_OFFSET;MENU_SEL_TYPE;nrElems;FUNCTION;info;status;SEL;RESTART;STOP=typeInstallation;LICENSE;0;0;-1;0;13;f1;Windows-Defende...
MENU_GRP                       0
MENU_SEL_TYPE
MENU_OFFSET
nrElems
sel_input
MENU_IDX 

信息- $menuObjts.MENUS:

代码语言:javascript
复制
MENU;PARENT;MENU_GRP;MENU_IDX;MENU_OFFSET;MENU_SEL_TYPE;nrElems;FUNCTION;info;status;SEL;RESTART;STOP
-----------------------------------------------------------------------------------------------------
typeInstallation;LICENSE;0;0;-1;0;13;f1;Windows-Defender has to be uninstalled                       
activate;;0;1;-1;0;13;f2;Windows has to be upgraded if working with an EVALUATION prod key;-1;0;0;0  
NAME;HOST;0;2;-1;0;13;f3;F-SEC has to be configured as an isolated machine on the CSI server;-1;0;0;0
IP;;0;3;-1;0;13;f4;disable default Windows NTP service;-1;0;1;0                                      
routes;;0;4;-1;0;13;f5;disable default Windows NTP service;-1;0;0;0                                  
users;;0;5;-1;0;13;f6;disable default Windows NTP service;-1;0;0;0                                   
ANTI VIRUS;SERVICEs;0;6;-1;0;13;f7;disable default Windows NTP service;-1;0;0;0                      
NTP;;0;7;-1;0;13;f8;;-1;0;0;0                                                                        
MEINBERG;;0;8;-1;0;13;f9;;-1;0;0;0                                                                   
addPATH;postgres;0;9;-1;0;13;f10;;-1;0;0;0                                                           
check;after CSI;0;10;-1;0;13;f11;;-1;0;0;0                                                           
execute;;0;11;-1;0;13;f12;;-1;0;0;1                                                                  
quite;;0;12;-1;0;13;f13;;-1;0;0;1                                                                    
WINDOWS DEFENDER;ANTI VIRUS;6;13;12;1;4;f14;;-1;0;0;0                                                
F-SEC;;6;14;12;1;4;f15;;-1;0;0;0                                                                     
execute;;6;15;12;1;4;f16;;-1;0;0;1                                                                   
quite;;6;16;12;1;4;f17;;-1;0;0;1

补充信息2021/05/04

代码语言:javascript
复制
PS C:\Users\Administrator> $menuObjts.MENUS | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name          MemberType   Definition
----          ----------   ----------
Equals        Method       bool Equals(System.Object obj)
GetHashCode   Method       int GetHashCode()
GetType       Method       type GetType()
ToString      Method       string ToString()
FUNCTION      NoteProperty string FUNCTION=f1
info          NoteProperty string info=Windows-Defender has to be uninstalled, before installing an other anti-virus program
MENU          NoteProperty string MENU=typeInstallation
MENU_GRP      NoteProperty string MENU_GRP=0
MENU_IDX      NoteProperty string MENU_IDX=0
MENU_OFFSET   NoteProperty string MENU_OFFSET=-1
...

PS C:\Users\Administrator> $menuObjts.MENUS 
MENU          : typeInstallation
PARENT        : LICENSE
MENU_GRP      : 0
MENU_IDX      : 0
MENU_OFFSET   : -1
MENU_SEL-TYPE :
nrElems       : 13
FUNCTION      : f1
info          : Windows-Defender has ...
status        : -1
SEL           : 0
RESTART       : 1
STOP          : 

MENU          : activate
PARENT        : 
MENU_GRP      : 0
...

我的印象是,Value : {@{MENU=将$menus_作为“值”添加,而不是作为$menuObjts -$menuObjts的对象添加。

代码语言:javascript
复制
PS C:\Users\Administrator> $menuObjts.MENUS.PSobject.Properties
ReferencedMemberName : Length
ConversionType       : 
MemberType           : AliasProperty
TypeNameOfValue      : System.Int32
IsSettable           : False
IsGettable           : True
Value                : 17
Name                 : Count
IsInstance           : False

MemberType      : Property
Value           : 17
IsSettable      : False
IsGettable      : True
TypeNameOfValue : System.Int32
Name            : Length
IsInstance      : True
...
MemberType      : Property
Value           : {@{MENU=typeInstallation; PARENT=LICENSE; MENU_GRP=0; MENU_IDX=0; MENU_OFFSET=-1; MENU_SEL-TYPE=; nrElems=13;FUNCTION=f1; info=Windows-Defender has to be uninstalled, before installing an other anti-virus program;status=-1; SEL=0; RESTART=1; STOP=},
@{MENU=activate; PARENT=; MENU_GRP=0; MENU_IDX=1; MENU_OFFSET=-1; MENU_SEL-TYPE=; nrElems=13; FUNCTION=f2; info=Windows has to be upgraded if working with an EVALUATION prod key;status=-1; SEL=0; RESTART=0; STOP=},
@{MENU=NAME; PARENT=HOST; MENU_GRP=0; MENU_IDX=2; MENU_OFFSET=-1;MENU_SEL-TYPE=; nrElems=13; FUNCTION=f3; info=F-SEC has to be configured as an isolated machine on the CSI server;status=-1; SEL=0; RESTART=0; STOP=},
@{MENU=IP; PARENT=; MENU_GRP=0; MENU_IDX=3; MENU_OFFSET=-1; MENU_SEL-TYPE=;nrElems=13; FUNCTION=f4; info=disable default Windows NTP service; status=-1; SEL=0; RESTART=1; STOP=}...}
IsSettable      : False
IsGettable      : True
TypeNameOfValue : System.Object
Name            : SyncRoot
IsInstance      : True
...
EN

回答 1

Stack Overflow用户

发布于 2021-05-02 20:04:06

首先,我建议大家好好阅读一下: 何地对象 about_Arrays 和这篇关于 PS对象的好文章

代码语言:javascript
复制
# Storing the CSV in the $csv var

$csv = @'
MENU;PARENT;MENU_GRP;MENU_IDX;MENU_OFFSET;MENU_SEL_TYPE;nrElems;FUNCTION;info;status;SEL;RESTART;STOP
typeInstallation;LICENSE;0;0;-1;0;13;f1;Windows-Defender has to be uninstalled                       
activate;;0;1;-1;0;13;f2;Windows has to be upgraded if working with an EVALUATION prod key;-1;0;0;0  
NAME;HOST;0;2;-1;0;13;f3;F-SEC has to be configured as an isolated machine on the CSI server;-1;0;0;0
IP;;0;3;-1;0;13;f4;disable default Windows NTP service;-1;0;1;0                                      
routes;;0;4;-1;0;13;f5;disable default Windows NTP service;-1;0;0;0                                  
users;;0;5;-1;0;13;f6;disable default Windows NTP service;-1;0;0;0                                   
ANTI VIRUS;SERVICEs;0;6;-1;0;13;f7;disable default Windows NTP service;-1;0;0;0                      
NTP;;0;7;-1;0;13;f8;;-1;0;0;0                                                                        
MEINBERG;;0;8;-1;0;13;f9;;-1;0;0;0                                                                   
addPATH;postgres;0;9;-1;0;13;f10;;-1;0;0;0                                                           
check;after CSI;0;10;-1;0;13;f11;;-1;0;0;0                                                           
execute;;0;11;-1;0;13;f12;;-1;0;0;1                                                                  
quite;;0;12;-1;0;13;f13;;-1;0;0;1                                                                    
WINDOWS DEFENDER;ANTI VIRUS;6;13;12;1;4;f14;;-1;0;0;0                                                
F-SEC;;6;14;12;1;4;f15;;-1;0;0;0                                                                     
execute;;6;15;12;1;4;f16;;-1;0;0;1                                                                   
quite;;6;16;12;1;4;f17;;-1;0;0;1
'@|convertfrom-csv -Delimiter ';'

获取array 的第一个元素

代码语言:javascript
复制
$1stElementGrp_ = $csv[0]                  # Like this
$1stElementGrp_ = $csv | Select-Object -First 1   # Or Like this

获取变量MENU_OFFSET $1stElementGrp_的属性和的值。

代码语言:javascript
复制
$menuOFFSET_ = $1stElementGrp_.MENU_OFFSET # $menuOFFSET_ returns -1
$menuNrElems_ = $1stElementGrp_.nrElems # $menuNrElems_ returns 13

不知道你在尝试什么,

代码语言:javascript
复制
# $menuObjts.MENU_OFFSET = ($menuObjts.MENUS | Where-Object {
#   [int]$($_).MENU_GRP -eq $menuObjts.MENU_GRP
# }| Select -First 1).MENU_OFFSET
# 
# $menuObjts.nrElems = @($menuObjts.MENUS | Where-Object {
#   [int]$($_).MENU_GRP -eq $menuObjts.MENU_GRP -and [int]$($_).SEL -eq 1}).Count
# }

MENU_OFFSET = -1示例:如果您想过滤中的所有行

代码语言:javascript
复制
$csv | Where-Object {$_.MENU_OFFSET -eq -1} |
       Select-Object MENU, PARENT, MENU_GRP, MENU_IDX, MENU_OFFSET |
       Format-Table

返回

代码语言:javascript
复制
MENU             PARENT    MENU_GRP MENU_IDX MENU_OFFSET
----             ------    -------- -------- -----------
typeInstallation LICENSE   0        0        -1
activate                   0        1        -1
NAME             HOST      0        2        -1
IP                         0        3        -1
routes                     0        4        -1
users                      0        5        -1
ANTI VIRUS       SERVICEs  0        6        -1
NTP                        0        7        -1
MEINBERG                   0        8        -1
addPATH          postgres  0        9        -1
check            after CSI 0        10       -1
execute                    0        11       -1
quite                      0        12       -1

示例:如果要筛选MENU_GRP =6和菜单与单词“WINDOWS”匹配的所有行

代码语言:javascript
复制
$csv | Where-Object {$_.MENU_GRP -eq 6 -and $_.MENU -match 'Windows'} |
       Select-Object MENU, PARENT, MENU_GRP, MENU_IDX, MENU_OFFSET |
       Format-Table

返回:

代码语言:javascript
复制
MENU             PARENT     MENU_GRP MENU_IDX MENU_OFFSET
----             ------     -------- -------- -----------
WINDOWS DEFENDER ANTI VIRUS 6        13       12
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67359974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档