PowerShell学习笔记(1):基础


  前段时间在知乎上得知Windows下的一款强大的命令行工具PowerShell(原谅我刚刚得知)。 其强大的功能,令人惊叹,兴趣盎然,这么优秀的工具值得我去学习、了解, 虽然我并不是程序猿。我的测试练习环境:win7 PowerShell v1.0


基础内容


命令的概念与术语

  基本命令形式如下:
command -parameter1 -parameter2 arg1 arg2
- command:命令名称
- parameter1:开关参数
- parameter2 arg1:带参数变量的参数
- arg2:位置参数

例:Write-Output -InputObject HelloWorld
  dir -Recurse -Filter *.ps1 D:\Test,其中开关参数-Recuse指定dir命令显示指定目录及其子目录下的所有文件,-Filter *.ps1过滤出后缀为ps1的文件。

命令分类

  PowerShell中的命令可以分为四类:cmdlets、functions、scripts、native Win32 executables。

cmdlet C#源码例子:

[Cmdlet("Write", "InputObject")]
public class MyWriteInputObjectCmdlet : Cmdlet
{[Parameter]public string Parameter1;[Parameter(Mandatory = true, ValueFromPipeline=true)]public string InputObject;protected override void ProcessRecord(){if (Parameter1 != null)WriteObject(Parameter1 + ":" + InputObject);elseWriteObject(InputObject);}
}

shell函数命令源码例子:

function Write-InputObject
{param($Parameter1)process{if ($Parameter1){"$Parameter1: $_"}else{"$_"}}
}

shell脚本命令源码例子:

param($Parameter1)
process
{if ($Parameter1){"$Parameter1:$_"}else{"$_"}
}

native Win32 executables也被称作为本地命令,是能被操作系统执行的外部程序。

别名与弹性语法

  PowerShell中实现了大量的预定义别名,这些别名可以分为两个基本的类别:transitional别名和convenience别名。使用Get-Command命令可以查看别名的具体的定义。

PowerShell语句解析

  双引号、单引号与反引号之间的区别。

  转义序列,如下:

    `n      换行         `r      回车     `t      水平制表符`a      警铃`b      退格`'      单引号`"      双引号   '0      空``      单反引号

  表达式模式与命令模式。在表达式模式中,字符串必须由引号括起,数字始终解析为数字等等。在命令模式中,数字被视为数字,但是其它的参数则被视为字符串(除非参数以$,@,’,”,(开头,当以这些特殊字符开头时,其后的参数被解析为值表达式)。
  模式解析例子,如下:

    2+2     表达式模式,结果是4.write-output 2+2    命令模式,结果是 “2+2”.$a=2+2  表达式模式,变量$a被赋值为值4write-output (2+2)  表达式模式,2+2被作为表达式计算得到值4,然后作为参数传给write-outputwrite-output $a     表达式模式,参数前有特殊字符write-output $a.Equals(4)   表达式模式,$a.Equals(4)计算得到Boolean值Truewrite-output $a/dir.txt 命令模式,首先参数被计算为4/dir.txt,然后解释器发现并不是一个合法的表达式,然后将其转换为命令模式

  有两种语句终止方式:一种是以分号”;”终止,还有一种是以换行符终止。

  管线是由管线操作符”|”分割的一系列命令,如:

    dir -recurse -filter *.cpp | format-table name,length

  格式化与输出。可以通过$PSHOME查看所安装的默认格式数据库的所在路径。


类型处理


基本类型与字面值

  PowerShell中的字面值:strings,numbers,array,dictionaries,hashtables。
  PowerShell中,字符串是一个16位的Unicode字符序列,其直接由.NET System.String类型直接实现。单引号、双引号字符串,例:"Double quoted string""Single quoted string"。here-strings:以@<quote><newline>开头,并以<quote><newline>@结尾。
  数值字面值。PowerShell支持所有基本的.NET数值类型并可在需要时完成不同类型之间的转换。数值字面值如下:

数值字面值 .NET全类型名 短类型名
1 System.Int32 [int]
10000000 System.Int64 [long]
1.1 System.Double [double]
1d System.Decimal [decimal]

  数值乘数后缀:

乘数后缀 乘数因子 例子 等效值 .NET类型
kb/KB 1024 1KB 1024 System.Int32
kb/KB 1024 2.2KB 2252.8 System.Double
mb/MB 1024*1024 1MB 1045876 System.Int32
mb/MB 1024*1024 2.2MB 2306867.2 System.Double
gb/GB 1024*1024*1024 1Gb 1073741824 System.Int32
gb/GB 1024*1024*1024 2.14Gb 3371549327.36 System.Double

  创建Hash表,语法以@{开头以}结尾,在分隔符内以定义键值对集,其中键值以=分割,不同的键值对以;分割。例:$test = @{ b1 = "prml"; b2 = "ia"},可以通过$test.b1$test['b1']访问值,通过$test.keys得到所有键。
  PowerShell中创建数组的方式以逗号分割,例$test = 1, 2, 3,对于数字数组还可以使用范围运算符$test = 2 .. 3。PowerShell中数组默认是多态的,即可以在数组中存储任意类型的对象。创建单元素数组$test = ,1,创建空数组$test = @()

类型名别名:

PowerShell类型别名 .NET类型
int[] System.Int32
[int[]] System.Int32[]
[long] System.Int64
[long[] System.Int64[]
[string] System.String
[string[]] System.String[]
[char] System.Char
[char[]] System.Char[]
[bool] System.Boolean
[bool[]] System.Boolean[]
[byte] System.Byte
[byte[]] System.Byte[]
[double] System.Double
[double[]] System.Double[]
[decimal] System.Decimal
[decimal[]] System.Decimal[]
[float[]] System.Single
[single] System.Single
[regex] System.Text.RegularExpressions.Regex
[array] System.Array
[xml] System.Xml.XmlDocument
[sriptblock] System.Management.Automation.ScriptBlock
[switch] System.Management.Automation.SwitchParameter
[hashtable] System.Collections.Hashtable
[psobject] System.Management.Automation.PSObject
[type] System.Type
[type[]] System.Type[]

  访问静态方法,[类名]::属性名,如[math]::cos([math]::pi / 3)
  类型转换,例:[string] [char[]] ( [int[]] [char[]] $s | foreach {$_+1} )


操作符与表达式


  算术运算符

运算符 描述
+ 两个值(数值、字符串、数组)相加
* 两个值(数值、字符串、数组)相乘
- 两个值(数值)相减
/ 两个值(数值)相除
% 两个值(数值)相模

  赋值运算符:=+=-=*=、=%=

  比较运算符

运算符 描述
-eq -ceq -ieq 等于
-ne -cne -ine 不等于
-gt -cgt -iget 大于
-ge -cge -ige 大于等于
-lt -clt -ilt 小于
-le -cle -ile 小于等于
-contains -ccontains -icontains 左侧的集合包含右侧指定的值
-notcontains -cnotcontains -inotcontains 左侧的集合不包含右侧指定的值

注:“c“变体表示大小写敏感,”i“变体表示大小写不敏感.未加限定比较运算符是大小写不敏感的。

  模式匹配操作符,有两种匹配类型:通配符表达式(wildcard expressions)、正则表达式(regular expressions)。

  通配符模式匹配运算符

运算符 描述
-like -clike -ilike 通配符模式匹配,匹配上表达式值则为True
-notlike -cnotlike -inotlike 与-like相反

  PowerShell中的通配符模式

运算符 描述
* 匹配字符串中零个或多个字符
? 匹配任意单个字符
[<char>-<char>] 匹配字符区间中的字符
[<char><char>..] 匹配字符集中任意一个字符

  正则表达式匹配操作符

运算符 描述
-match -cmatch -imatch 正则表达式模式匹配
-notmatch -cnotmatch -inotmatch 与-match相反
-replace -creplace -ireplace 替换字符串中正则匹配的部分

  逻辑与按位操作符

运算符 描述
-and 逻辑与
-or 逻辑或
-xor 异或
-not 逻辑非
-band 按位与
-bor 按位或
-bxor 按位异或
-bnot 位非

高级操作符与变量


  以类型为参数的操作符

运算符 描述
-is 操作符左侧的类型与右侧匹配,则表达式为True
-isnot 与-is相反
-as 将操作符左侧的值转换为右侧指定的类型的值

  一元操作符:-(将参数转为数值,求负)、+(将参数转换为数值,并返回数值结果)、--(将参数转换为数值,前缀返回新值,后缀返回原值)、++(类似于--)、[<type>](类型转换)、(一元逗号操作符,创建一个新的单元素数组)。

  表达式与分组操作符:(...)$(...)@(...)(返回结果是一个数组)。

  范围运算符..,生成连续的数值数组的快捷方式。

  方法属性操作符:.::(静态方法)。

  格式化运算符:-f是一个二元运算符,运算符左侧是格式化字符串,右侧是需格式化的数组。例:$test = "{2} {1} {0}" -f 1, 2, 3"

  重定向运算符

运算符 例子 描述
> dir > out.txt 重定向输出到文件。如果文件已存在,则清空当前的内容;如果文件不存在, 则创建该文件
>> dir >> out.txt 重定向输出到文件。如果文件已存在,则追加到当前的文件;如果文件不存在,则创建该文件
2> dir nosuchfile.txt 2> err.txt 重定向错误流到文件…
2>> dir nosuchfile.txt 2>> err.txt 重定向错误流到文件…
2>&1 dir nosuchfile.txt 2>&1 将错误流写到输出管线

  变量:PowerShell中不需显示的声明变量,在第一次赋值时自动创建,变量以$为前缀。


流控制语句


  if/elseif/else语句,例:

if ($test -gt 100)
{"It's greater than one hundred"
}
elseif ($test -gt 50)
{"It's greater than 50"
}
else
{"It's not very good"
}

  while循环,例:

$val = 0
while ($val -ne 3)
{$val++Write-Host "The number is $val"
}

  do-while循环,例:

$val = 0
do
{$val++Write-Host "The number is $val"
} while($val -ne 3)

  for循环,例:

for ($i = 0; $i -le 10; $i++)
{$i;
}

  foreach循环,例:

foreach ($i in "hello")
{$i
}

  label,break,continue,例:

for ($i = 0; $i -le 15; $i++)
{if ($i % 2){   continue }if ($i -eq 10){   break   }$i
}:outer while ($true)
{while ($true){   break outer }
}

  switch语句。switch语句是PowerShell中最强大的语句,该语句将模式匹配,分支,迭代组合在一个控制结构中。switch语句语法形式如下:

            switch -options ( <pipeline> ){<pattern> { <statementList> }<pattern> { <statementList> }.....default   { <statementList> }}
-options:控制怎样匹配,可以是-regex、-wildcard、-match、-case。-case:大小写敏感。-wildcard:通配符。-regex:正则表达式。
<pipeline>:用于产生值控制switch分支。另外,也可以指定序列-file <expr>代替<pipeline>。
pattern/action语句.所有的模式匹配语句都将执行,default语句仅当其他匹配模式都没匹配到时执行。

  使用cmdlets进行流控制,例:

dir *.txt | foreach-object {$_.length}1..10 | where-object { ! ($_ -band 1) }

函数与脚本


  PowerShell函数的基本形式如下:

function <name> (<parameter list>) { <statement> }
function subtract ($from, $to) { &from - &to }
function subtract ([int]$from, [int]$to) { $from - $to }function <name> ($p1=<expr1>, $p2=<expr2>...){<statementList>}
function subtract ($from=2, $to=1) { $from - $to }

  参数类型

参数类型 描述
Switches Switches参数,例:Get-ChildItem -Recurse
Options Options参数,可带参数值,例:Get-ChildItem -Filter *.txt
Arguments 位置参数,不需要有名字关联位置参数
function arith( [switch] $sub, [int] $x, [int] $y )
{if ($sub){$x - $y}else{$x + $y}
}

  PowerShell变量的作用域。PowerShell支持四个作用域:全局(global)、本地(local)、私有(private)和脚本(script)。

  $global:test = 1 全局变量,在所有的作用域中有效,如果在脚本或者函数中设置了全局变量,即使脚本和函数都运行结束,这个变量也任然有效。
  $script:test = 1 脚本变量,只会在脚本内部有效,包括脚本中的函数,一旦脚本运行结束,这个变量就会被回收。
  $private:test = 1 私有变量只会在当前作用域有效,不能传递给其它的作用域,只能在当前作用域下读写。
  $local:test = 1 局部变量,可以省略修饰符,在当前作用域有效。本地变量能够在其它作用域下读取,但是不能通过其它作用域修改,只有本地作用域可以修改。

  return返回函数值,例:

function fact($x)
{if ($x -lt 2){return 1}$x * (fact($x - 1))
}

  在管线中使用函数。通过特殊变量$input可以实现在管线中使用函数,这个变量包含一个枚举器以处理输入集合。例:

function sum($para)
{$total = 0while ($input.MoveNext()){$total += $input.Current.$p}$total
}dir | sum length

  过滤器执行一次,并自动实现循环管线中的每个元素。与函数通过$input来访问当前管线对象不同,过滤器有一个特殊的变量$_表示当前的管线对象。过滤器的一般形式与示例如下:

filter <name> (<parameter list>) {<statementList>}

filter sum
{if ($_ % 2 -eq 0){   $_}
}

  cmdlet风格的函数,完整函数语法定义如下:

function <name> (<parameter list>)
{begin {<statementList> #第一个管线对象可用之前执行}process {<statementList> #逐一执行每个管线对象}end {<statementList> #所有管线对象执行完后执行}
}function test ($x)
{begin{ $c = 0; "In begin, C is $c, x is $x"}process{ $c++; "In process, c is $c, x is $x, `$_ is $_"}end{"In end, c is $c, x is $x"}
}

参考文档
1. 《Windows PowerShell in Action》
2. 使用Windows PowerShell 编写脚本
3. PowerShell-脚本之家
4. Cmdlet Overview
5. PowerShell中文博客

转载于:https://www.cnblogs.com/corfox/p/5415007.html

PowerShell学习笔记(1)-基础相关推荐

  1. PowerShell 学习笔记 - 1 PS Core 基础

    PowerShell 学习笔记 - 1 PS Core 基础 本章主要探讨 PowerShell 核心,主要基于 Linux 平台上的 PowerShell Core 实现,实际上于 Windows ...

  2. PowerShell 学习笔记 - 2 PS Module

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

  3. Docker:学习笔记(1)——基础概念

    Docker:学习笔记(1)--基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...

  4. Python学习笔记_1_基础_2:数据运算、bytes数据类型、.pyc文件(什么鬼)

    Python学习笔记_1_基础_2:数据运算.bytes数据类型..pyc文件(什么鬼) 一.数据运算 Python数据运算感觉和C++,Java没有太大的差异,百度一大堆,这里就不想写了.比较有意思 ...

  5. python input 拖入路径 去除转义 空格_python学习笔记(基础-2)(转载)

    1.输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字. 2.输入 如果要让用户从电脑输入一些字符怎么办?Python提供了一个input(),可以让用户输入字符串,并存放到一个变 ...

  6. php基础教学笔记,php学习笔记:基础知识

    php学习笔记:基础知识 2.每行结尾不允许有多余的空格 3.确保文件的命名和调用大小写一致,是由于类Unix系统上面,对大小写是敏感的 4.方法名只允许由字母组成,下划线是不允许的,首字母要小写,其 ...

  7. java基本语法心得_Java学习笔记(一)——基础语法(上)

    Java学习笔记(一)--基础语法(上) 软件构造 写在前面 编写Java程序时,应注意以下几点:大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的 ...

  8. C基础学习笔记——01-C基础第02天(用户权限、VI操作、Linux服务器搭建)

    在学习C基础总结了笔记,并分享出来.有问题请及时联系博主:Alliswell_WP,转载请注明出处. 01-C基础第02天(用户权限.VI操作.Linux服务器搭建) 打开终端:ctrl+alt+t ...

  9. Python入门学习笔记1-Python基础

    Python入门学习笔记1-Python基础 前言:本文介绍了Python学习的前导知识概念以及必记基础函数,如善用help方法查看帮助文档,以及内置对象类型的概念以及常用函数的详解. 一.Pytho ...

最新文章

  1. docker几个基础命令及nodejs容器
  2. mysql中整理设置__MySQL整理
  3. Web 的MSN,可以不用装客户端
  4. mysql - 索引_07
  5. 设计实用素材|促销海报设计技巧
  6. python字典的键可以是int吗_Python:大int键的快速字典
  7. 【Trie】【HDU1247】【Hat’s Wordsfd2】
  8. uva 1463 - Largest Empty Circle on a Segment(二分+三分+几何)
  9. 4. 简单的webservices 例子
  10. 【雕爷学编程】Arduino动手做(94)---L298N电机驱动板
  11. Android 12中系统Wallpaper详解1--锁屏透看壁纸和桌面透看壁纸的切换
  12. 《暗时间(第2版)——思维改变生活》全书网址链接汇总
  13. Image data of dtype object cannot be converted to float 问题解决
  14. vue中好用的视频插件推荐,video+canvas实现视频截图第一帧,ffmpeg实现视频截图第一帧
  15. 估算的合同总价与实际的合同总价
  16. 基于MATLAB/Simulink的电力电子电路仿真技术——三相电流滞环跟踪逆变器
  17. 文字练习-读书的目的
  18. 文字05 自定义字体
  19. CAD控件:网页浏览DWG文件的CAD插件
  20. 三下乡辅导孩子计算机知识,【“三下乡”社会实践活动】计算机学院——每个课程,都是你我成长的故事...

热门文章

  1. 近期“速卖通母婴行业需求暴增”,带你了解母婴行业选品趋势
  2. 速卖通消费电子行业市场分析热销及需求品类推荐
  3. 全球及中国牛乳腺炎治疗系统行业发展调研及投资预测分析报告2022-2027年
  4. JS与flash交互通信控制的方法
  5. python排序链表快速排序算法_八大排序之快速排序算法-python实现
  6. SEO三种职位类型:编辑型SEO、技术型SEO、营销型SEO详解
  7. Hive环境的安装部署(完美安装)(集群内或集群外都适用)(含卸载自带mysql安装指定版本)...
  8. cb-A10系统优化之(一):去除自启动软件
  9. 那些年,因为英语不好所闹出的笑话!
  10. 俞军:产品经理必备的2个模型