文档章节

PowerShell 中 function 返回值的陷阱

RareH
 RareH
发布于 2017/08/18 11:25
字数 485
阅读 197
收藏 3

问题描述

PS 中的 function 使用起来非常自由,但它会对返回值做一种奇怪的处理。

我们一起来看下面这段代码,你认为这个 function 的返回值是什么类型?

function TestReturn () {
  $ls = [System.Collections.Generic.List[int]]::new()
  $ls.Add(1)
  return $ls
}
$(TestReturn).GetType()

喂!这怎么看都是返回了一个 List<int> 吧?

但是你运行之后得到的结果是这样的:

啊!!!我 List<int> 呢???

然后当我们“天真地”将这个返回值当作一个 List<int> 使用时,大概会得到一个:

“Method invocation failed because [System.Int32] does not contain a method named 'xxx'.”

原因分析

不止 List<int> 会这样, Queue<int> 以及其他常用的泛型/非泛型集合、甚至 Array 都是副德性……那我们大概可以进一步推测:所有 collection 都是这德性(欢迎读者验证并评论)。

具体原因不明,大概只有 PS 的设计者能解释了吧。

我推测与它对于多个返回值的处理有关(http://www.pstips.net/powershell-specify-return-value-from-function.html),这个设计的逻辑感觉就像是:

“多个返回值变成一个 Object[],只包含一个 item 的 collection 返回值会变成一个 item”

前者显然是有好处的,但我看不到后者的意义,希望知情者能在评论区解释一下,感激不尽!

解决方案

我还是希望得到一个 collection(返回的类型与 collection 的 Count 相关什么的真是太扯了)。

所以对于这种多此一举的设计,我选择使用 PS 强大的类型转换(http://www.pstips.net/powershells-type-conversion-magic.html)解决:每当调用的函数可能返回一个仅包含一项的 collection 时,通过强制类型转换得到预期的 collection 类型

$tr = [System.Collections.Generic.List[int]]$(TestReturn)

当然,你也可以选择 Foreach-Object 这样强大的 cmdlet,这样就不必纠结它是 item 还是 collection 了,也许这样更符合 PS 设计者的初衷?

© 著作权归作者所有

RareH
粉丝 0
博文 2
码字总数 1370
作品 0
武汉
程序员
私信 提问
PowerShell中格式化命令和输出命令

今天, 我将为您介绍如何使用格式化和输出命令. 在PowerShell中,负责进行格式化和输出的是三类cmdlet。他们分别是:Format-、Out-和 Write- 。顾名思义,Format- 主要是用来对信息进行格式化...

TracyZhang
2012/06/03
112
0
python调用powershell、远程执行bat

python调用本地powershell方法 1、现在准备一个简陋的powershell脚本,功能是测试一个IP列表哪些可以ping通: function test_ping($iplist){ } test_ping args[0] python简陋的调用方法: # ...

zhoujie0111
2013/12/31
0
0
windows7中右键菜单添加powershell

1、首先打开regedit 找到 HKEYCLASSESROOTDirectoryBackgroundshell 2、添加powershell (默认打开是没有powershell这一项的!!!) -右击shell目录:新建-》项 把新建的项目录名字设置成p...

哥本哈根的小哥
05/31
51
0
PowerShell的内网渗透之旅(一)

  内网渗透一直以来都是一个热门话题,试想在一个大型的内网环境下,当我们拿到了内网windows机器后,我们该如何通过他们去获取更多的所需资源,这就需要我们进行内网渗透了。然而在内网渗...

FreeBuf
2018/05/14
0
0
渗透测试神器之PowerShell入门必备

  简介   对于渗透测试而言,PowerShell非常强大。   在这个系列文章中,我们会集中讲解它的强大之处。   本文是为渗透测试员准备的PowerShell系列的第一篇,我们将从使用PowerShel...

嘶吼RoarTalk
2018/07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt程序打包发布方法(使用官方提供的windeployqt工具)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/toTheUnknown/article/details/81748179 如果使用到了Qt ...

shzwork
42分钟前
7
0
MainThreadSupport

MainThreadSupport EventBus 3.0 中的代码片段. org.greenrobot.eventbus.MainThreadSupport 定义一个接口,并给出默认实现类. 调用者可以在EventBus的构建者中替换该实现. public interface ...

马湖村第九后羿
今天
3
0
指定要使用的形状来代替文字的显示

控制手机键盘弹出的功能只能在ios上实现,安卓是实现不了的,所以安卓只能使用type类型来控制键盘类型,例如你要弹出数字键盘就使用type="number",如果要弹出电话键盘就使用type="tel",但这...

前端老手
今天
6
0
总结:Raft协议

一、Raft协议是什么? 分布式一致性算法。即解决分布式系统中各个副本数据一致性问题。 二、Raft的日志广播过程 发送日志到所有Followers(Raft中将非Leader节点称为Follower)。 Followers收...

浮躁的码农
今天
7
0
Flask-admin Model View字段介绍

Model View字段介绍 can_create = True 是否可以创建can_edit = True 是否可以编辑can_delete = True 是否可以删除list_template = 'admin/model/list.html' 修改显......

dillonxiao
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部