PowerShell 学习笔记 - 1 PS Core 基础

本章主要探讨 PowerShell 核心,主要基于 Linux 平台上的 PowerShell Core 实现,实际上于 Windows PowerShell 平台上进行的实验获得的结果也不会有太大区别:

# 运行容器
C:\Users\chuny>docker run -it --name ps-test-base mcr.microsoft.com/powershell:centos-7
PowerShell 6.1.0
Copyright (c) Microsoft Corporation. All rights reserved.https://aka.ms/pscore6-docs
Type 'help' to get help.PS /> $PSVersionTable.PSVersionMajor  Minor  Patch  PreReleaseLabel BuildLabel
-----  -----  -----  --------------- ----------
6      1      0PS /> $PSVersionTable.OS
Linux 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:55:56 UTC 2018

学习一门 Shell 首先要从记忆他的命令(族)做起,但 UNIX Shell 及其历史演进中的开源化特质,使得 Linux 内 bash 可调用项的命名系统支离破碎,以如下二进制为例:

  • ls / wc:源于两个简写 list 与 word count
  • uname:源于系统调用 uname()
  • date:源于非缩写的英文单词 date
PS /> ls |wc -l
19
PS /> uname
Linux
PS /> date
Sun Sep 16 06:59:33 UTC 2018

三个常用二进制的命名源于三种不同的模式,非 UNIX 专业户单单从这些名字上就可能会产生恐惧感。

Windows 世界内,通过原住民 CMD 调用的原生应用命名也有异曲同工之妙:

C:\Users\chuny>taskmgr.exeC:\Users\chuny>calc.exeC:\Users\chuny>ipconfig.exe

PowerShell 采取了不同的策略,设计了更加简单好记的 cmdlet 命名范式,cmdlet 实际上并不是命令,而是托管于 .Net 平台的实例,关于 cmdlet 是什么的讨论已经远远超出了本系列的初衷,实际一般脚本工作中,形成一段脚本依靠的是粘合原生功能形成的工作流,而不必关心这些原生功能是如何实现的。

cmdlet 深入内容参考:Windows PowerShell Cmdlet Concepts

例如 Linux 中,单单一个管道的底层实现便是千行规模的,更不必说建立在各种库上面的二进制了。

Linux 管道的实现思路:How Linux pipes work under the hood

因此,cmdlet 即平台相关的原生功能的抽象,以如下的一段获取时间的代码片段为例:

PS /> $dateNow = Get-Date
PS /> $dateNowSunday, September 16, 2018 6:55:39 AM
PS /> $dateNow.GetType()IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     DateTime                                 System.ValueType
PS /> $dateNow.GetType().Name
DateTime
PS /> $dateNowSunday, September 16, 2018 6:55:39 AM

cmdlet

Get-Date 为一个标准的预置 PowerShell cmdlet,
PowerShell 使用动-名命名范式,即每个 cmdlet 标准名称都由一个标识意图的动词、连字符以及一个标的物名词组成。

预置 PowerShell cmdlet:由于 PowerShell 启动时默认的载入 Microsoft.PowerShell.Utility 模块,因此其中的 cmdlet 是开箱即用的,或者说是预置的。

PowerShell 同时内建了高效的帮助系统供用户自学 cmdlet 等的使用方式,以搜索日期相关的 cmdlet 为例:

PS /> Get-Help -Category cmdlet DateName                              Category  Module                    Synopsis
----                              --------  ------                    --------
Update-Help                       Cmdlet    Microsoft.PowerShell.Core ...
Get-Date                          Cmdlet    Microsoft.PowerShell.U... ...
Set-Date                          Cmdlet    Microsoft.PowerShell.U... ...
Update-FormatData                 Cmdlet    Microsoft.PowerShell.U... ...
Update-TypeData                   Cmdlet    Microsoft.PowerShell.U... ...

Get-Help 即为 PowerShell 体系中的标准帮助函数,类似于 UNIX 世界中的 manGet-Help -Category cmdlet Date 代表在 cmdlet 这一种类中搜索 Date 这一字符串相关的项目,Get-help 可通过查看自身获得基本帮助,即 Get-Help Get-Help

同时,PowerShell 也提供了一个 cmdlet 以供精确的命令搜索

PS /> Get-Command -Noun DateCommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-Date                                           6.1.0.0    Microsoft.PowerShell.Utility
Cmdlet          Set-Date                                           6.1.0.0    Microsoft.PowerShell.Utility

此次对 Date 的搜索精确到了获取标的物名词可用的命令种类,获取到了 Dategettersetter

同时,PowerShell 对于 cmdlet 也是大小写不敏感的,例如:

PS /> Get-DaTeSunday, September 16, 2018 7:51:50 AM
PS /> get-dateSunday, September 16, 2018 7:51:52 AM

但作为更好的工程实践,建议严格遵守 cmdlet 原始写法,实际上交互式 Shell 中只需在输入 cmdlet 后利用 Tab 补全即可获得原始写法。

PowerShell 也提供别名系统用以简化命令输入,但建议只在交互式 Shell 中使用,例如下行中的 gal 又是什么呢:

PS /> (gal).Name.Length
110# 实际上 gal 即 Get-Alias 的别名,直接运行 gal 可以获得现已加载的模块中存在的别名列表
PS /> (Get-Alias gal).Definition
Get-Alias

如果生产环境脚本中大量出现这样的别名势必大大影响可读性。

变量

$dateNow = Get-Date 中的 $dateNow 声明一个名为 dateNow变量,变量亦可以在建立时不指定值:

PS /> $newVar
PS /> $newVar
# 无输出

变量名可以包含下划线字符,也可以是任何字母数字字符。变量在 使用时,始终使用$ 字符加变量名称指定变量

$dateNow = Get-Date等式右方计算返回的对象赋予左方,注意此时左方为一个确定的实例,两者具备同样的类型,以如下的片段为例,两者类型相同,然而值不一样,$dateNow 已经是最近一次赋值时绑定的对象,Get-Date 将使用默认值初始化并返回一个匿名对象:

PS /> $dateNow.GetTypeCode()
DateTime
PS /> (Get-Date).GetTypeCode()
DateTime# $dateNow 是一个实例
PS /> $dateNow.GetType.IsInstance
True# 两个匿名对象的 Hash 值不同
PS /> (Get-Date).GetHashCode()
433633629
PS /> (Get-Date).GetHashCode()
431809023

对象操作

PowerShell 中的变量存储对象,因此其中对变量的操作将遵循面向对象的方式进行。

Get-Member cmdlet 用于获取变量(对象)中的成员,例如对于 $dateNow 其具备属性 Year 与成员方法 ToType

PS /> $dateNow | Get-Member -Name YearTypeName: System.DateTimeName MemberType Definition
---- ---------- ----------
Year Property   int Year {get;}PS /> $dateNow | Get-Member -Name ToTypeTypeName: System.DateTimeName   MemberType Definition
----   ---------- ----------
ToType Method     System.Object IConvertible.ToType(type conversionType, System.IFormatProvider provider)

因此,对于对象成员的调用也通过 . 运算符实现:

# 方法调用
PS /> $dateNow.ToString()
9/16/18 7:23:57 AM# 成员调用(即调用该成员的 getter 方法,如不存在直接返回值)
PS /> $dateNow.Year
2018# 成员更新(即调用该成员的 setter 方法,如不存在直接写值,此处该属性已经被声明为只读属性,所以无法更改)
PS /> $dateNow.Year = -2
'Year' is a ReadOnly property.
At line:1 char:1
+ $dateNow.Year = -2
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : PropertyAssignmentException

对于 PowerShell 工作流的形成也将围绕对象与管道展开,以一段获取并格式化生成列表的 AJAX 请求为例:

根据快递 100 提供的开放查询 API,可以查询到某快递公司某单号的具体递送信息,如下为例:

# 定义变量
$baseUrl = "www.kuaidi100.com/query"
$scheme = "http"
$company = "yuantong"
$postId = "11111111111"# 发送请求
$ret = Invoke-RestMethod -Uri ($scheme + "://" + $baseUrl + "?type=" + $company + "&postid=" + $postId)# Get-Member 检查该返回对象中的成员
PS /> $ret | Get-MemberTypeName: System.Management.Automation.PSCustomObjectName        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
com         NoteProperty string com=yuantong
condition   NoteProperty string condition=00
data        NoteProperty Object[] data=System.Object[]
ischeck     NoteProperty string ischeck=0
message     NoteProperty string message=ok
nu          NoteProperty string nu=11111111111
state       NoteProperty string state=0
status      NoteProperty string status=200# $ret 的返回值为 200 SUCCESS
PS /> $ret.status
200# 通过管道连接,便可输出只包含固定字段的记录中的某些项(例如前五项)
PS /> $ret.data | Format-Table -Property Time, Context | select -First 5time                                                        context
----                                                        -------
2018-09-14 10:20:06                                         贾岗社区28号楼1单元101室妈妈驿站已发出自提短信,请上门自提,联系电话0371-60997919
2018-09-14 10:19:06                                         快件已到达贾岗社区28号楼1单元101室妈妈驿站,联系电话0371-60997919
2018-08-23 09:58:40                                         华伟家园东门头房快递服务中心妈妈驿站已发出自提短信,请上门自 提,联系电话17662528999

PowerShell 学习笔记 - 1 PS Core 基础相关推荐

  1. PowerShell 学习笔记 - 2 PS Module

    PowerShell 学习笔记 - 2 PS Module 本章主要探讨 PowerShell 的模块化,由于 PowerShell Core 现版本下已经移植的模块较少以及存在大量强依赖于平台的功能 ...

  2. PowerShell学习笔记(1)-基础

    PowerShell学习笔记(1):基础   前段时间在知乎上得知Windows下的一款强大的命令行工具PowerShell(原谅我刚刚得知). 其强大的功能,令人惊叹,兴趣盎然,这么优秀的工具值得我 ...

  3. AD学习笔记(一)基础认识

    文章目录 AD学习笔记 第一讲 AD基础认识 一.两库两图(分别对应下图) 1.PCB图(pcbdoc) 2.原理图(schdoc) 3.原理图库(schlib) 4.PCB库(pcblib) 二.封 ...

  4. UE4 Material 101学习笔记——01-07 介绍/PBR基础/UV扭曲/数据类型/翻页动画/材质混合/性能优化

    UE4 Material 101学习笔记--01-07 介绍/PBR基础/UV扭曲/数据类型/翻页动画/材质混合/性能优化 Lec 01 什么是着色器 What Is A Shader? 1.1 介绍 ...

  5. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  6. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  7. Linux 学习笔记之超详细基础linux命令 Part 3

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 2----------------- ...

  8. XML学习笔记01【xml_基础、xml_约束】

    Java后端 学习路线 笔记汇总表[黑马程序员] XML学习笔记01[xml_基础.xml_约束][day01] XML学习笔记02[xml_解析][day01] 目录 01 xml_基础 今日内容 ...

  9. 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版)

    经过几天的学习,opencv基础部分学习完啦.整理出来. OpenCV opencv学习笔记1:图片读入,显示与保存(有代码) opencv学习笔记2:图像处理基础 opencv学习笔记3:像素处理 ...

最新文章

  1. android 服务器201,Android端i-jetty服务器开发(八)
  2. asp.net core策略授权
  3. 掌握这个姿势,女友不再叨叨叨
  4. c语言fgets函数的用法
  5. ISOLINUX: A bootloader for Linux using ISO 9660/El Torito CD-ROMs
  6. php 判断字符串为时间,检查字符串是否为unix时间戳
  7. 网络表示学习算法综述
  8. WindowsServer2003虚拟机 安装SQL2005失败 终于找到原因了
  9. Python入门--创建类的对象
  10. 论一种迫不得已用全中文数据库的情景
  11. HDOJ--2112--HDU Today
  12. TransactNamedPipe函数
  13. 通过 Nginx 来实现禁止国外IP访问网站
  14. 3DMax 安装 超图 插件
  15. 关闭WinSAT.exe Windows 系统评估工具服务
  16. react+express +materialui模板
  17. android之broadcastreceiver 耳机按键,Android BroadcastReceiver 实时监听耳机拔出事件
  18. OpenHarmony鸿蒙相关资料
  19. C++程序设计课程主页-2013级
  20. O-RAN notes(12)---Bronze E2 setup and O1-alarm example(1)

热门文章

  1. 简单代码实现100内阿拉伯数字转英文
  2. Delete数据如何恢复
  3. 股票配资炒股技巧是什么?
  4. Vmware ubuntu桥接方式联网
  5. android 实现视频播放功能,Android项目实现视频播放器
  6. 黑马程序员——OC基础05—Foundation框架
  7. Maven入门---如何在idea中配置Maven
  8. 如何让一个电机转起来
  9. 前端----HTML/CSS 圆角边框
  10. 2015年07月16日