2

PowerShell脚本十个基本概念

 2 years ago
source link: https://hypersharp.net/ops/31-ten-basic-points-of-powershell/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

1、PS1文件

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

2、执行权限

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

Get-ExecutionPolicy

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

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

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

Set-ExecutionPolicy 

3、运行脚本

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

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

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

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

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

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

Get-Process | Sort-Object ID

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

人们很容易将变量想象成一个仓库,但在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 test8、Join

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

"Brien","Posey" -join " "

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

8、Join

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

"Brien","Posey" -join " "

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

运行一个新创建的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不会逐步执行,整个函数将会一次性执行。 

原文地址


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK