yyyyyyyyyyyyyyyyyyyy

博客园 首页 新随笔 联系 订阅 管理

有关PowerShell脚本你必须知道的十个基本概念

相对于传统的命令行工具,PowerShell对很多用户来说都会显得非常陌生。PowerShell脚本提 供了一个方便的方法来自动化各种琐事。本文介绍了关于PowerShell的一些基本概念,对于PowerShell初学者,掌握这些概念有助于加深对 PowerShell脚本的理解。

AD:51CTO开启企业运维技术盛宴_嘀嘀、新浪、白鹭齐聚MDSA线下沙龙,赶紧报名吧!

【51CTO精选译文】PowerShell脚本提供了一个方便的方法来自动化各种琐事。下面是关于PowerShell的一些基本概念,对于PowerShell初学者,掌握这些概念有助于加深对PowerShell脚本的理解。

51CTO推荐专题:Windows中的脚本技术-Windows Powershell

1、PS1文件

一个PowerShell脚本其实就是一个简单的文本文件,这个文件包含了一系列PowerShell命令,每个命令显示为独立的一行,对于被视为PowerShell脚本的文本文件,它的文件名需要使用.PS1扩展。

2、执行权限

为防止恶意脚本的执行,PowerShell有一个执行策略,默认情况下,这个执行策略被设为受限的(Restricted),意味着PowerShell脚本无法执行,你可以使用下面的cmdlet命令确定当前的执行策略:

Get-ExecutionPolicy

你可以选择使用的执行策略有:

  1. Restricted - 脚本不能运行。
  2. RemoteSigned - 本地创建的脚本可以运行,但从网上下载的脚本不能运行(除非它们拥有由受信任的发布者签署的数字签名)。
  3. AllSigned – 仅当脚本由受信任的发布者签名才能运行。
  4. Unrestricted – 脚本执行不受限制,不管来自哪里,也不管它们是否有签名。

你可以使用下面的cmdlet命令设置PowerShell的执行策略:

Set-ExecutionPolicy <policy name>

3、运行脚本

如果你想从命令行运行一个可执行文件,多年来一个永恒不变的方法是,在命令行转到该执行文件所在的位置,然后键入该执行文件的名称,但这个古老的方法现在却不能适用于PowerShell可执行脚本了。

如果你想执行一个PowerShell脚本,通常必须键入完整的路径和文件名,例如,假设你要运行一个名为SCRIPT.PS1的脚本,你可以键入:

C:\Scripts\Script.ps1

最大的例外是,如果PowerShell脚本文件刚好位于你的系统目录中,那么你可以直接在命令提示符后键入脚本文件名即可运行,如:

.\Script.ps1

注意前面需要加上.\,这和Linux下执行Shell脚本的方法如出一辙。

4、管道

管道的作用是将一个命令的输出作为另一个命令的输入,两个命令(或cmdlet)之间只需要用管道符号(|)连接即可。

为了帮助你了解管道是如何工作的,我们以一个例子进行说明,假设你想创建运行在服务器上的进程列表,并按进程的ID号进行排序,可以使用Get- Process cmdlet命令获得进程列表,但默认情况下列表不会排序,如果将这个cmdlet命令的输出用管道输送给Sort-Object ID命令,进程列表将会按进程ID号进行排序,如:

Get-Process | Sort-Object ID

5、变量

虽然可以使用管道将一个命令的输出输送给另一个命令,但管道本身也是有限制的,当你用管道从一个命令向另一个命令传递输出结果时,输出结果立即被使用,但有时候,你可能需要保存输出结果一段时间,以便以后可以使用(或重用),这个时候管道就应该下场,轮到变量上场了。

人们很容易将变量想象成一个仓库,但在PowerShell中,变量可以保存命令的完整输出,例如,假设你想保存服务器处于运行中的进程列表,你可以将它赋给一个变量,如:

$a = Get-Process

在这里,变量被命名为$a,如果你想使用这个变量,只需要简单地调用它的名称即可,例如,键入$a便可在屏幕上打印变量的内容。

你可以将多个用管道连接的命令的最终输出赋给一个变量,只需要用一对小括号将命令括起来即可,例如,假设你想按进程ID对运行中的进程进行排序,然后将结果输出给一个变量,你可以使用下面这个命令:

$a = (Get-Process | Sort-Object ID)

6、@符号

通过使用@符号,你可以将列表内容转换成一个数组,例如,下面的代码创建了一个名为$Procs的变量,它包含多行文本内容(一个数组):

$procs = @{name="explorer","svchost"}

使用变量时你也可以使用@符号,为了确保它作为数组而不是单个值处理,例如,下面的代码将在我前面定义的变量上运行Get-Process cmdlet命令:

Get-Process @procs

Windows将显示Windows资源管理器和Svchost使用的所有进程,注意变量前使用的@符号,而不是常见的$符号。

7、Split

Split操作符根据你指定的字符拆分一个文本字符串,例如,假设你想将一个句子拆分成一个单词组成的一个数组,你可以使用下面的命令做到:

"This is a test" -split " "

拆分后的结果如下:

This is a test

8、Join

就像Split可以将一个文本字符串拆分成多块一样,Join的操作则是逆向的,将多个独立的块连接成一个整体,例如,下面这行代码将会创建一个文本字符串,由我的名字和姓氏组成:

"Brien","Posey" -join " "

命令末尾双引号之间的空格告诉Windows在两个文本字符串之间插入一个空格。

9、断点

运行一个新创建的PowerShell脚本时,如果脚本有Bug,会遇到意想不到的后果,保护自己的一个方法是在脚本的关键位置插入断点,这样你就可以确保脚本正常运行先,然后再处理可能存在的问题。

插入断点最简单的方法是根据行号插入,例如,假设你要在第10行插入一个断点,可以使用下面的命令:

New-PSBreakpoint -Script C:\Scripts\Script.ps1 -Line 10

你也可以将断点绑定到变量上,如果你希望你的脚本任何时候都可以修改a$的内容,可以使用下面的命令:

New-PSBreakpoint -Script C:\scripts\Script.ps1 -variables a

注意,我在变量名后并没有包括美元符号。

可以和PSBreakpoint一起使用的动词包括New,Get,Enable,Disable和Remove。

10、Step

调试一个脚本时,有时可能需要逐行运行脚本,这时你可以使用Step-Into cmdlet命令,它会使脚本一行一行地执行,不管有没有设置断点,如果你想从这种步进式运行模式退出来,使用Step-Out cmdlet命令即可,但需要注意的是,使用Step-Out cmdlet命令后,断点仍然有效。

顺便说一句,如果你的脚本使用了函数,你可能对Step-Out cmdlet更感兴趣,Step-Out的工作方式和Step-Into一样,不过,如果调用了一个函数,Windows不会逐步执行,整个函数将会一次性执行。

 

 

 

 

PowerShell 在线教程 4


 

认识Powershell

Powershell交互式

Powershell变量

Powershell数组和哈希表

Powershell管道

Powershell使用对象

Powershell条件判断

Powershell循环

Powershell函数

Powershell脚本

Powershell错误处理

Powershell命令发现和脚本块

Powershell文本和正则表达式

PowerShell处理XML

PowerShell文件系统

PowerShell注册表

 

 

 PowerShell是跨平台的,cmd是Windows专用的。
PowerShell有面向对象的管道。
PowerShell能够调用.NET的很多功能。

 

 

作者:mosser lee
链接:https://www.zhihu.com/question/22611859/answer/23552345
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

为什么PowerShell如此之强大?

  1. 破天荒的方便
    诸如存储计算中GB,MB,KB单位等;数组声明中的1..n和下标为-1的处理;还有所见即所得,通俗易懂的动词+名词结构Cmdlet。
  2. 面向对象
    与面向过程,面向文本相比,面向对象更方便更容易描述现实世界,也算赶上了时髦。
  3. 绑上.NET这棵大树
    正所谓大树下面好乘凉,PowerShell绑上.NET这个大款了,借助.NET Framework平台强大的类库,几乎让一切都成为可能。
  4. 强大的兼容性
    完全兼容windows 平台上其它调用,如可执行文件(exe),批处理bat和vb script脚本等。
  5. 基于平台的可扩展性
    这一条是重点。微软有个优点,与应用相比,它更喜欢做平台。PowerShell早已变成一个平台,在PowerShell 刚发布的第二年,微软的System Center Operations Manager 和 SharePoint就提供了针对该平台的组件,后来的AD,Hyper-V,Windows Azure,Office 365就更不用说了。除了微软,亚马逊的云平台管理,Dell的out-of-hand 管理,也都提供了基于PowerShell的管理组件。PowerShell 俨然变成了一个标准,变成了一个规范。
 
说到底也就比 cmd 强一点,然后依旧那么难用。最强的就是一个 .net。然而,既然都要写代码了,好好用个 python nodejs 不更好吗?用什么 .net 啊。所以,很强活着理论上很强,但一点都不好用,所以毫无意义,依旧没人愿意用。
 
powershell的访问权限很大(针对MS的产品来说),比VB要灵活。更重要的是,在云计算大热的今天,powershell内置有Azure相关的command。同样的功能让我用bash来实现我估计头都大了,单单是处理json就有够复杂的,要grep、awk、正则表达式啥啥啥的,而ps里面只需要一个ConvertFrom-Json就能自动把整个json内容转化为一个对象,而引用其中的值只需要一个小点点(例如:json.content),爱了爱了。当然python也有很强大的json处理功能,但是在Windows上还是原生的ps更方便啊!
 

 

 

 

posted on 2015-08-24 02:13  xxxxxxxx1x2xxxxxxx  阅读(308)  评论(0编辑  收藏  举报