微软Windows操作系统最初的设计目标是面向非技术用户, 甚至是对计算机不感兴趣的人群, 因此, 真正自动化, 强大的Shell一直不是微软公司所关心的问题。

但是,随着Windows开拓市场,随着需要管理的计算机数量提升, 就必须依靠能够有效自动化计算机配置的工具, 这是开发PowerShell的一个重要原因。

为什么不使用已有的shell或扩展cmd.exe呢? 我们熟知的bash, ksh是为unix, linux系统设计的, 优化的shell, 从这些操作系统内核提供的system call来看, shell将内核的特性真正表现出来。

但是, Windows操作系统和unix, linux是完全不同的, Windows将大部分管理通过面向对象的方式进行管理, 提供了诸如COM, WMI等概念。

传统的shell输出信息都是字符串, 这样有利于统一的处理, 但是字符串也是你唯一能够操作的对象。

PowerShell开发队伍为了能够为Windows提供更好的优化, 因此选择了重新创建一门新的语言。

希望大家在和Cantgis一起学习PowerShell的过程中, 能够多思考。

下面开始放出powershell语法及解释

1.其实在powershell 中,运行数学运算相当简单,只需要输入自己想要输入的数值和法则,结果就立即呈现。这里不需要打什么语句,执行的结果可以输入,不会丢失,第四个例子就是输出结果。

你看我们轻松计算出20+200的结果在使用powershell。

PS C:\> 20 + 200
220

2.我们在学习HTML语言或者任何语言首先使用的是helloworld,powershell也不例外,让我们尝试输入一下。

PS D:\> "hello world,powershell"
hello world,powershell

3.powershell也很好的支持四则混合运算,使用()括号键来修改运算符的优先级和结合性,这里需要注意:powershell支持不同的数据类型

PS D:\> (6+8)*45-(56*7)/2
434

4.除了将运算结果输出到显示屏幕, 我们可以将结果存储到临时文件, 然后用type命令将文件的结果取回. 看起来powershell 确实power了。

你看我这里就把运算出来的数值放到D盘的powershell命名的txt文档,如果你懒得手动打开txt查看结果,这时候需要键入type命令,直接读取这个文本里的数值。

PS D:\> (6+8)*45-(56*7)/2 >d:powershell.txt
PS D:\> type D:\powershell.txt
434

5.除了将运算结果存储到文件, 我们可以通过变量赋值, 将运算结果存储到变量中, 并使用该变量进行后续的计算工作,更深入的四则运算。

下面我们看到 我们定义了 $N的数值为9 结果运算显示了出来,结果我们/3 显示结果为3,由于首次定义为n=9他是不会被改变的,所以我们在继续运算也是那个固定的数值哦。

PS D:\> $n = (1+2)*3
PS D:\> $n
9
PS D:\> $n/3
3
PS D:\> $n/3
3
PS D:\> $n/5
1.8

6.powershell是支持对象的语言,我们将命令返回的结果赋值给这个变量,$files中包含了当前目录的对象集合,使用数组访问的语法,就可以获得改位置的对象。
下面我们看到的D盘的目录。注意powershell的数组是从零开始的。

PS D:\> $files =dir
PS D:\> $files[1]
    目录: D:\
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----          2013/6/8      9:40            fs.cer

7.大多数常见语言,都提供一些操作集合类型的语法。最基本的集合类型就是数组类型,它提供了一种下标基于0的数组对象。

首先Cantgis会通过几个例子,来了解一下PowerShell中的数组是如何使用的。

这个例子输出了四个对象:数值1、字符串“a”、数值“10MB”和十六进制的“0x100”,也明确的解释出powershell数组类型的语法,事实上,在powershell中只要把不同对象用逗号“,”连接起来。就可以构成数组对象。如果不手动执行输入文本格式,powershell默认的格式器和输出器会输出到显示器上,最终我们看到了这个数组的结果。

PS D:\> 1,'a',10MB,0x100
1
a
10485760
256

8.下面我们简单的使用几个变量来存储数组,在输出看看数组对象的更多可用特性,在下面的第一个例子中,将四个数组存放到变量:$array1中,接下来我们要将数值1定位于$int中。

数组对象上属性为count来指出当前数组对象的数量值为4(a.b.c.d.确实是四个)$int中并没有count属性(这个现象就需要下一个例子解释)

PS D:\> $array1 = 'a','b','c','d'
PS D:\> $int = 1
PS D:\> $array1.count
4
PS D:\> "$array1"
a b c d
PS D:\> $int.count
PS D:\> "$int"
1

PS:这里我们说一下。在powershell中如果引用的属性不存在,它会返回$null对象,该对象不会对显示器也就是呈现的控制台造成任何影响,只提示用户继续输入命令。


9.powershell是基于对象的shell,我们看看数组究竟是什么对象呢,接下来我们继续进行cmdlet,我们执行后发现一个现象,在powershell中调用对象gettype()方法,可以得到该对象的类型对象,注意类型对象也是一个对象。改对象的fullname属性表现为该类型的名称。
如果你想要知道一个对象的类型就调用gettype()方法,然后再访问fullname属性就可以了。

PS D:\> $array1.gettype().fullname
System.Object[]

10.下面我们学习一下如何访问数组中的元素。实际上powershell的数组是通过.net类库中的数组来实现的,到这里我们发现了powershell是在.net类库原有之上添加了访问的接口,对象还是.net类库的对象

使用数组时候大家记住数组的第一个元素为“0”、数组的最后一个元素下表是数组长度减一 数组长度就是属性length得出,Count是属性Length的别名,这主要是为不同对象提供一致性接口的技术。这里需要特别注意的是,当数组访问越界也就时,PowerShell是不会给出任何错误信息的,只会得到一个$null对象。

PS D:\> $cantgis = 1,2,3
PS D:\> $cantgis.length
3
PS D:\> $cantgis[0]
1
PS D:\> $cantgis[2]
3
PS D:\> $cantgis[4]
PS D:\>

11.向数组中添加新的元素,在perl中,大家只需要见得使用索引,然后再存储上数值就OK,然后如果大家用perl的方法在继续操作的话,会出现数组赋值错误,超出范围哦!

对于索引越界问题,powershell 需要执行下面的代码。

PS D:\> $a = "Cantgis","IPHONE4"
PS D:\> $a[0]
Cantgis
PS D:\> $a[1]
IPHONE4
PS D:\> $a[2]="IPHONE5"
数组赋值失败,因为索引“2”超出范围。
所在位置 行:1 字符: 4
+ $a[ <<<< 2]="IPHONE5"
    + CategoryInfo          : InvalidOperation: (2:Int32) [], RuntimeException
    + FullyQualifiedErrorId : IndexOutOfRange
只需要把数组中“加”起来,执行下列代码解决索引越界
PS D:\> $a = $a+"IPHONE5"
PS D:\> $a
Cantgis
IPHONE4
IPHONE5
PS D:\> $a[2]
IPHONE5

12.结尾如果需要向数组中添加更多的对象时,必须使用“+”运算符。在执行powershell实际上进行下面的操作过程

创建一个新的数组,该数组的大小能够存下运算结果的所有对象;
将第一个数组的成员拷贝到新数组中;
将第二个数组的成员拷贝到新数组中;

如果数组中包含的元素很多,过多的向数组中添加对象,一定会使powershell执行脚本时更慢。
powershell是一个工具,不要依赖它来向数组添加对象,在.net类库中好多数据结构都能够满足经常向数组中添加对象的请求。

谢谢大家陪Cantgis一起学习powershell之路,我们刚刚走过往里长征的开端,接下来,我们会逐渐深入。