给大家安利一下 PowerShell

Yev Bronshteyn 的头像

·

·

·

9,367 次阅读

代码更简洁、脚本更清晰、跨平台一致性等好处是让 Linux 和 OS X 用户喜爱 PowerShell 的原因。

今年(2018)早些时候,Powershell CoreMIT 开源协议发布了正式可用版(GA)。PowerShell 算不上是新技术。自 2006 年为 Windows 发布了第一版 PowerShell 以来,PowerShell 的创建者在结合了 Unⅸ shell 的强大和灵活的同时也在弥补他们所意识到的缺点,特别是从组合命令中获取值时所要进行的文本操作。

在发布了 5 个主要版本之后,PowerShell 已经可以在所有主流操作系统上(包括 OS X 和 Linux)本地运行同样创新的 shell 和命令行环境。一些人(应该说是大多数人)可能依旧在嘲弄这位诞生于 Windows 的闯入者的大胆和冒失:为那些远古以来(从千禧年开始算不算?)便存在着强大的 shell 环境的平台引荐自己。在本帖中,我希望可以将 PowerShell 的优势介绍给大家,甚至是那些经验老道的用户。

跨平台一致性

如果你计划将脚本从一个执行环境迁移到另一个平台时,你需要确保只使用了那些在两个平台下都起作用的命令和语法。比如在 GNU 系统中,你可以通过以下方式获取昨天的日期:

date --date="1 day ago"

在 BSD 系统中(比如 OS X),上述语法将没办法工作,因为 BSD 的 date 工具需要以下语法:

date -v -1d

因为 PowerShell 具有宽松的许可证,并且在所有的平台都有构建,所以你可以把 PowerShell 和你的应用一起打包。因此,当你的脚本运行在目标系统中时,它们会运行在一样的 shell 环境中,使用与你的测试环境中同样的命令实现。

对象和结构化数据

*nix 命令和工具依赖于你使用和操控非结构化数据的能力。对于那些长期活在 sedgrepawk 环境下的人们来说,这可能是小菜一碟,但现在有更好的选择。

让我们使用 PowerShell 重写那个获取昨天日期的实例。为了获取当前日期,使用 Get-Date cmdlet(读作 “commandlet”):

> Get-Date                        

Sunday, January 21, 2018 8:12:41 PM

你所看到的输出实际上并不是一个文本字符串。不如说,这是 .Net Core 对象的一个字符串表现形式。就像任何 OOP 环境中的对象一样,它具有类型以及你可以调用的方法。

让我们来证明这一点:

> $(Get-Date).GetType().FullName
System.DateTime

$(...) 语法就像你所期望的 POSIX shell 中那样,计算括弧中的命令然后替换整个表达式。但是在 PowerShell 中,这种表达式中的 $ 是可选的。并且,最重要的是,结果是一个 .Net 对象,而不是文本。因此我们可以调用该对象中的 GetType() 方法来获取该对象类型(类似于 Java 中的 Class 对象),FullName 属性 则用来获取该类型的全称。

那么,这种对象导向的 shell 是如何让你的工作变得更加简单呢?

首先,你可将任何对象排进 Get-Member cmdlet 来查看它提供的所有方法和属性。


> (Get-Date) | Get-Member
PS /home/yevster/Documents/ArticlesInProgress> $(Get-Date) | Get-Member         

   TypeName: System.DateTime

Name                 MemberType     Definition                                 
-     

via: <https://opensource.com/article/18/2/powershell-people>

作者:[Yev Bronshteyn](https://opensource.com/users/yevster) 译者:[sanfusu](https://github.com/sanfusu) 校对:[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注