首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >powershell -在新的数组中组合数组属性

powershell -在新的数组中组合数组属性
EN

Stack Overflow用户
提问于 2018-02-18 04:32:44
回答 2查看 577关注 0票数 0

我有一些有很多行(数千行甚至更多)的数组。它有“列XXXXX”这样的列。

行示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Group_name = "proxy_users"
Column1   = "domain\Igor"
Column2   = null
.......
Column989 = 'domain\Andrew'
Column999 = 'domain\Mike'

创建新变量的正确和快速的方法是“ColumnXXX”忽略'null‘值的总和?

比如“域\igor,域\Andrew,域\mike”

我可以使用smth类似于$group的-Property选择-Property“列*”...but,如何求和,以及如何忽略null?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-18 04:54:25

可以使用ex列出所有属性。$_.psobject.properties,筛选出您想要的值,并使用-join组合这些值。例如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$o = [pscustomobject]@{
    Group_Name = "Test"
    Column1 = "Foo"
    Column2 = $null
    Column3 = "1"
}, [pscustomobject]@{
    Group_Name = "Test2"
    Column1 = $null
    Column2 = "Bar"
    Column3 = "2"
}

#Add property as constant
$o | ForEach-Object {
    $_ | Add-Member -NotePropertyName Summed -NotePropertyValue (($_.psobject.Properties | Where-Object { $_.Name -ne 'Group_name' -and $_.Value -ne 'null' } | Select-Object -ExpandProperty Value) -join '' )
}
$o | ft

也可以使用ScriptProperty计算每个调用的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Remember to exclude itself to avoid infinite recursion
$o | Add-Member -MemberType ScriptProperty -Name Summed -Value {($this.psobject.Properties | Where-Object { $_.Name -ne 'Group_name' -and $_.Name -ne 'Summed' -and $_.Value -ne 'null' } | Select-Object -ExpandProperty Value) -join '' }
$o | ft

结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Group_Name Column1 Column2 Column3 Summed
---------- ------- ------- ------- ------
Test       Foo             1       Foo1
Test2              Bar     2       Bar2

作为一种替代,您可以使用$_.Name -like 'Column*' -and $_.Value -ne 'null'作为属性筛选器,如果它们实际上称为ColumnXXX的话。

票数 2
EN

Stack Overflow用户

发布于 2018-02-18 05:33:02

要用更简洁的Frode F.'s elegant ScriptProperty-based solution版本来补充PSv4+版本,这也是因为避免在属性定义脚本块中使用cmdlet(管道)来支持操作符(有大量的输入对象,这可能很重要):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$o | Add-Member -PassThru -MemberType ScriptProperty -Name Joined -Value { 
 @($this.psobject.Properties.Where({$_.Name -match 'Column*'}).Value) -ne 'null' -join ', ' 
}

注意使用:

  • .Where()集合运算符(PSv4+),这是Where-Object cmdlet的一个更快的替代方法。
  • https://stackoverflow.com/a/44620191/45375 (PSv3+),其中在集合级别访问属性将生成元素属性值的数组; 例如,$this.psobject.Properties.Name生成$this.psobject.Properties集合的所有元素的.Name属性值。
  • 将比较运算符-ne应用于数组值LHS,在这种情况下,运算符充当筛选器:运算符应用于每个元素,匹配元素作为数组返回;注意LHS周围的@(...),这确保了即使它恰好返回单个值,它也被视为数组。

对于问题中的示例数据,上面的结果(查找属性Joined):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Group_name : proxy_users
Column1    : domain\Igor
Column2    : null
Column989  : domain\Andrew
Column999  : domain\Mike
Joined     : domain\Igor, domain\Andrew, domain\Mike

通过上述优化,您甚至可以考虑一个更简单的Select-Object解决方案,该解决方案构建新的自定义对象实例,其中包含所有输入对象的属性(*),以及一个新的计算属性,该属性包含感兴趣的合并列值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$o | Select-Object *, @{ n='Joined'; e={ 
  @(($_.psobject.Properties.Where({$_.Name -match 'Column*'})).Value) -ne 'null' -join ', ' } 
}

这个解决方案比上面的方法慢,但没有太多。

请注意,如果您收集内存中的所有输出,新构造的对象将占用原始对象以外的空间。

可选阅读:性能比较;管道使用的影响:

下面的代码重复了Frode和我的答案中的各种方法。

下面是我的机器的一个示例计时--绝对值并不重要,但它们的比率是(尽管我不知道CPU核心计数和磁盘速度等因素将如何发挥作用)--输入集大小是1000对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Approach                                 TotalSeconds
--------                                 ------------
add-member w/ scriptproperty - operators 0.35
select-object w/ noteproperty            0.40
add-member w/ scriptproperty - pipeline  0.72
add-member w/ noteproperty - pipeline    0.98

结论:

  • 在属性定义中使用管道的解决方案速度明显较慢,约为2倍,即使输入计数更大,这似乎也不会有所不同。
  • 创建新对象的优化Select-Object-based解决方案(而不是向输入对象添加属性)比优化的Add-Member解决方案稍微慢一些。

测试源代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# The number of input objects to test with.
# Adjust to experiment.
$objCount = 1000

Write-Verbose -Verbose "# of input objects: $objCount"

$ndx = 0; $approaches = 'select-object w/ noteproperty', 
                        'add-member w/ scriptproperty - operators', 
                        'add-member w/ scriptproperty - pipeline', 
                        'add-member w/ noteproperty - pipeline'
$tempFile = New-TemporaryFile # requires PSv5+
$(foreach($approach in $approaches) {

  # Create test collection (recreate it in every iteration to support repeated Add-Member operations)
  $al = [System.Collections.ArrayList]::new()
  for ($i = 0; $i -lt $objCount; ++$i) {
    $null = $al.add([pscustomobject] @{ one = 1; Column1 = 'col1'; Column2 = 'col2'; Column3 = 'null'; Column4 = 'col4' })
  }

  Measure-Command {

    Write-Verbose -Verbose "Running: $approach..."
    switch ($ndx) {
      0 { # select-object w/ noteproperty
        $al | Select-Object *, @{ n='Joined'; e={ @(($_.psobject.Properties.Where({ $_.Name -match 'Column*'})).Value) -ne 'null' -join ', ' } } | 
          Export-Csv $tempFile  
        break
      }
      
      1 { # add-member w/ scriptproperty - operators
        $al | Add-Member -PassThru -MemberType ScriptProperty -Name Joined -Value { @($this.psobject.Properties.Where({ $_.Name -match 'Column*'}).Value) -ne 'null' -join ', ' } |
          Export-Csv $tempFile          
        break
      }
      
      2 { # add-member w/ scriptproperty - pipeline
        $al | Add-Member -PassThru -MemberType ScriptProperty -Name Joined -Value { ($this.psobject.Properties | Where-Object { $_.Name -match 'Column*'  -and $_.Value -ne 'null' } | Select-Object -ExpandProperty Value) -join ', ' }  | 
         Export-Csv $tempFile
         break
        }
        
        3 { # add-member w/ noteproperty - pipeline; requires an intermediate ForEach-Object call
          $al | ForEach-Object {
            $_ | Add-Member -PassThru -NotePropertyName Joined -NotePropertyValue (($_.psobject.Properties | Where-Object { $_.Name -match 'Column*' -and $_.Value -ne 'null' } | Select-Object -ExpandProperty Value) -join ', ' )
          } |
            Export-Csv $tempFile
        break
      }
      default { Throw "What are you doing here?" }
    }

    # Import-Csv $tempFile | Select-Object -First 1 Joined | Write-Verbose -Verbose

    ++$ndx
        
  } | Select-Object @{ n='Approach'; e={ $approach }}, @{ n='TotalSeconds'; e={ '{0:N2}' -f $_.TotalSeconds } }

}) | Sort-Object { [double] $_.TotalSeconds }

Remove-Item $tempFile
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48851718

复制
相关文章
.net通过boundary上传文件
public void UploadVedio(string fileName) { fileName = "input_video_only_3sec.mp4"; byte[] vedioBytes = null; using (FileStream fileStream = new FileStream(@"D:\缓存内容\test.mp4", FileMode.Open, FileAccess.Read))
SingYi
2022/07/13
5270
.net通过boundary上传文件
Selenium文件上传
日常的UI自动化测试过程中,经常会遇到文件上传的业务操作。对于通过input标签实现的上传功能, 我们可以直接利用Selenium提供的方法send_keys() 实现文件上传。这种文件上传实现方式是将本地文件的路径作为一个值放在input标签中,然后通过form表单将这个值提交给服务器。 本文将针对input标签示范自动化执行文件上传功能。
Altumn
2019/10/21
1.2K0
Selenium文件上传
Android通过URL文件下载及文件名提取
在写一个Android应用,需求也很简单就是通过接收JSON发送的数据进行解释获取URL的地址,然后根据这个地址把其文件下载。一下开始想用okhttp通过GET来下载问题,但问题是okhttp考虑得比较多也很完善(断线续传等);但这些我没必要也不需要这么复杂啊,那好吧简单点。就使用安卓自带的DownloadManager进行下载,不过用DownloadManager下载必须要满足API level 9以上,好在我的项目满足了,那就用呗,四行代码搞掂。
谭广健
2020/08/07
4.2K0
文件上传漏洞-通过ctf真题学习
前言:最近在学习一些ctf的东西,所以自己想从一个小白的身份,复现一些web的漏洞。学习一些大佬的思路!
亿人安全
2022/06/30
1.6K0
文件上传漏洞-通过ctf真题学习
通过 Smb 上传文件到电脑(无需密码)
win10基本都关闭了SMB1,但是win7是可以使用的,可以设置打开SMB1。也可以使用 SMB2/SMB3 。
Jingbin
2020/06/11
2.1K0
通过 Smb 上传文件到电脑(无需密码)
通过URL载入ShellCode代码
将生成的shellcode放到web服务器上,本地不保存恶意代码,本地只负责加载到内存运行,这样可以很好的躲过查杀。
微软技术分享
2022/12/28
6810
通过URL载入ShellCode代码
通过Url抓取网页内容
本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。
Java架构师必看
2021/03/22
1.7K0
通过 PHP把文件上传到服务器
注释: 允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。
用户9042463
2021/09/29
3.9K0
【逻辑漏洞】通过条件竞争进行文件上传
基本概念:竞争条件发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。
一名白帽的成长史
2020/06/24
5.5K0
【逻辑漏洞】通过条件竞争进行文件上传
asp.net中通过input file上传文件
<input id=”htmlFile” type=”file” runat=”server” />
全栈程序员站长
2022/09/09
2.1K0
element-ui上传组件,通过自定义请求上传文件
首先关闭自动上传,并给随便给action赋值一个字符串。(action是必填属性)
codeniu
2022/02/25
4.4K0
Selenium之文件上传、下载
文件上传功能的话,一般都是需要点击上传按钮,然后打开本地windwos窗口,从窗口中选择文件,然后进行上传,但是windwos的弹窗不属于浏览器页面的元素,通过WebDriver无法操作windwos控件,那么遇到这种情况的话,文件上传操作该如何去模拟呢?下面让小编带你来了解一下吧。
小博测试成长之路
2021/03/08
1.7K0
Selenium之文件上传、下载
通过 ReferenceOutputAssembly=False 在引用项目时,不额外引入依赖文件
正常当两个 .NET 项目有引用的时候,会将一个的输出拷贝到另一个的输出目录下。但有时我们只是希望通过引用建立一个依赖关系而已,最终两个项目的输出是独立的。
walterlv
2023/10/22
2840
通过 ReferenceOutputAssembly=False 在引用项目时,不额外引入依赖文件
Electron通过协议url唤起应用
前言 对于一个 URL 来说,其实就是指定了一个协议(protocol),然后让系统用对应的应用去打开它。如 myapp://openapp?name=1&pwd=2,系统会去找到已经注册了 myap
码客说
2021/01/29
3.9K1
coreml之通过URL加载模型
在xcode中使用mlmodel模型,之前说的最简单的方法是将模型拖进工程中即可,xcode会自动生成有关模型的前向预测接口,这种方式非常简单,但是更新模型就很不方便。
一棹烟波
2019/07/02
1.5K0
通过PicturreId获取图片路径(Url)
1.直接使用接口服务 _pictureService.GetPictureUrl((int)entity.SponsorPictureId); //entity是具体查询出来的实体对象 SponsorPictureId是entity实体中的图片Id 2.GetPictureUrl方法存在IPicture接口的实现类中  (2.1) IPicture 接口的定义 string GetPictureUrl(int pictureId, int targetSize = 0,
wfaceboss
2019/04/08
1.8K0
pdfGPT——通过AI与上传的PDF文件进行聊天
在AI浪潮风起云涌的当下,AI正在不断地重塑着每一个行业。笔者的目标是在公众号中把所有当下流行的AI应用都梳理一遍,在整理技术拓展思路的同时也给大家做一个科普。有一段时间没有介绍aigc相关的应用了,今天翻到了一个很早之前调研过的火了很久的一个项目—pdfGPT。
山行AI
2023/06/14
3K0
pdfGPT——通过AI与上传的PDF文件进行聊天
通过selenium抓取新浪微博
由于新浪微博的手机网页的访问加入了验证码,所以抓取新浪微博的后门行不通了,经过一系列的研究,最终使用selenium工具模仿浏览器行为访问新浪微博公众号,因为浏览器访问网页时是以访客的形式访问 ,所以避免了用户登录这一过程,可以顺利的进行指定微博的内容抓取,selenium的缺点是无法确定页面加载完毕的时间也js执行完毕的时间,所以在抓取效率方面会有所牺牲。
code2roc
2023/07/19
2480
EasyDSS平台如何通过接口在特定的视频分类里上传点播文件?
EasyDSS视频直播点播平台支持Flash、H5播放,可提供一站式的视频推拉流、转码、点播、直播、时移回放、存储等服务,支持播放H.265编码视频,可兼容多操作系统。搭配RTMP高清摄像头使用,可将设备的实时流推送到平台上,实现无人机视频推流直播,可应用在城市航拍、农业植保、森林防火、秸秆焚烧、电力巡检等场景中。
TSINGSEE青犀视频
2022/06/15
9030
点击加载更多

相似问题

船舶/潜艇运动模型的简单物理

40

简单(快速)掷出物理学

10

如何处理固定端和滑动重量的绳物理?

10

网络物理-内插导致物理引擎爆炸

10

简单游戏中的碰撞检测/物理

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文