第2章:基本的PowerShell概念

地空导弹

123.4 第3页
第3页共4页
PS C:\> get-command ipconfig |格式列表*FileVersionInfo:文件:C:\WINDOWS\system32\ ipconfig.exeInternalName: ipconfig.exeOriginalFilename: ipconfig.exeFileVersion: 5.1.2600.2180 (xpsp_sp2_rtm.040803 - 2158)文件描述:IP配置实用程序产品:Microsoftr Windowsr操作系统ProductVersion: 5.1.2600.2180调试:假修补:假预映:假PrivateBuild:假SpecialBuild:假语言:英语(美国)雷竞技比分路径:C:\WINDOWS\system32\ ipconfig.exe扩展:. exe定义:C:\WINDOWS\system32\ ipconfig.exe名称:ipconfig.exeCommandType:应用程序

对于一个函数定义属性是函数的主体:

PS C:\>获取命令提示符CommandType名称定义----------- ---- ----------函数提示写主机("PS " + $(Get-Lo…p C: \ >

使用别名定义属性是别名命令:

PS C:\>获取命令写CommandType名称定义----------- ---- ----------别名写才写输出p C: \ >

使用脚本文件,则定义属性是脚本的路径。使用非powershell脚本(例如a。bat.vbs,返回的信息与其他现有应用程序相同。

理解变量

一个变量是存储数据的地方。在大多数shell中,唯一可以存储在变量中的数据是文本数据。在高级shell和编程语言中,存储在变量中的数据几乎可以是任何东西,从字符串到序列再到对象。类似地,PowerShell变量可以是任何东西。

要定义PowerShell变量,必须使用美元前缀,它帮助描述来自别名、cmdlet、文件名和shell操作符可能希望使用的其他项的变量。变量名区分大小写,可以包含字母数字字符(A - z和0-9)和下划线(_)字符。虽然PowerShell变量没有设置命名约定,但是建议使用反映变量所包含数据类型的名称,如下例所示:

PS C:\> $MSProcesses = get-process |,其中{$_.company -match ".*Microsoft*"}p C: \ > MSProcesses美元处理NPM(K) PM(K) WS(K) VM(M) CPU(s) Id进程名------- ------ ----- ----- ----- ------ -- -----------68 4 1712 6496 30 0.19 2420715 21 27024 40180 126 58.03 3620 explorer647 19 23160 36924 109 18.69 1508我探索522 11 31364 30876 151 6.59 3268 powershell354 17 28172 47612 482 36.22 2464 WINWORDp C: \ >

如您从前面的示例中所见,其中包含的信息MSProcesses美元变量是当前在系统上运行的Microsoft进程的集合。


注意:变量名可以由任何字符(包括空格)组成,只要名称用大括号括起({}符号)。但是,如果使用非标准变量名,PowerShell会警告您不推荐这种做法。


内置的变量

当PowerShell会话启动时,会自动定义许多变量,如下例所示:

PS C:\>设置位置变量:PS变量:\ > get-childitem名义价值---- -----错误{CommandNotFoundException}DebugPreference SilentlyContinue概要文件\ \鲍勃'shosting.com \家庭\泰森\ \ P…我的文档家U: \主机System.Management.Automation.Internal.Host.In……MaximumHistoryCount 64MaximumAliasCount 4096输入System.Array + SZArrayEnumerator加在System.Management.Automation.CommandDis…ReportErrorShowSource 1ExecutionContext System.Management.Automation.EngineIntrinsics真正的真正的VerbosePreference SilentlyContinueShellId Microsoft.PowerShell假假MaximumFunctionCount 4096ConsoleFileNameReportErrorShowStackTrace 0FormatEnumerationLimit 4吗?真正的PSHOME C:\Program Files\Windows PowerShell \ v1.0MyInvocation System.Management.Automation.InvocationInfoPWD变量:\^ set-location_ReportErrorShowExceptionClass 0ProgressPreference继续ErrorActionPreference继续args {}MaximumErrorCount 256NestedPromptLevel 0WhatIfPreference 0$变量:= ReportErrorShowInnerException 0ErrorView NormalViewWarningPreference继续PID 3124ConfirmPreference高MaximumDriveCount 4096MaximumVariableCount 4096p C: \ >

这些内置的shell变量分为两种类型。第一种类型在PowerShell中有特殊的意义,因为它存储了当前PowerShell会话的配置信息。在这些特殊的变量中,下列变量应该被认为是值得注意的,因为它们在本书中经常使用:

  • $ _-包含当前管道对象

  • 美元的错误包含当前PowerShell会话的错误对象

PS C:\> get-service | where-object{$_。名字匹配“W32Time”}地位DisplayName的名字------ ---- -----------运行w32时间窗口时间p C: \ >p C: \ >美元错误表达式或语句中意外的令牌“名称”。p C: \ >

第二类内置变量由用于控制PowerShell行为的首选项设置组成。表2.4描述了这些变量PowerShell用户指南


注意:命令策略可以是以下字符串之一:SilentlyContinue,NotifyContinue,NotifyStop,或查询


表2.4 PowerShell首选项设置

的名字

允许的值

描述

DebugPrefere美元nce

命令政策

当数据通过Write-Debug在剧本或WriteDebug ()在cmdlet或提供程序中。

ErrorActionPreference美元

命令政策

当数据通过写错误在剧本或WriteError ()在cmdlet或提供程序中。

MaximumAliasCount美元

Int

别名的最大数目。

MaximumDriveCount美元

Int

允许的最大驱动器数。

MaximumErrorCount美元

Int

所持有的最大错误数美元的错误

MaximumFunctionCount美元

Int

可以创建的函数的最大数目。

MaximumVariableCount美元

Int

可以创建的变量的最大数量。

MaximumHistoryCount美元

Int

在命令历史记录中保存的最大条目数。

ShouldProcessPreference美元

命令政策

采取行动ShouldProcess在cmdlet中使用。

ProcessReturnPreference美元

布尔

ShouldProcess返回此设置。

ProgressPreference美元

命令政策

当数据通过Write-Progress在剧本或WriteProgress ()在cmdlet或提供程序中。

VerbosePreference美元

命令政策

当数据通过Write-Verbose在剧本或WriteVerbose ()在cmdlet或提供程序中。

了解别名

不幸的是,除非您正在运行一个脚本,否则使用PowerShell需要大量的输入。例如,打开PowerShell控制台并尝试输入以下命令:

PS C:\> get-process | where-object{$_。微软公司匹配”。* *”}

|格式-表名,ID,路径-自动调整大小

输入这个命令很长。幸运的是,与大多数shell一样,PowerShell支持cmdlet和可执行文件的别名。因此,如果希望减少此命令中的输入,可以使用PowerShell的默认别名。使用这些别名Get-Process例子是这样的:

PS C:\> gps | ?{$ _。微软公司匹配”。* *”}|ft Name, ID, Path

-Autosize

这个示例并没有减少大量的输入,但是别名可以节省一些时间并防止输入错误。要获取会话中支持的当前PowerShell别名的列表,请使用混叠如下面的示例所示。请注意,由于空间限制,该示例只显示了可用PowerShell别名的一小部分;实际执行时,将返回完整列表混叠cmdlet。

p C: \ >混叠CommandType名称定义----------- ---- ----------别名ac添加内容别名asnp Add-PSSnapin别名clc明确别名cli Clear-Item别名clp Clear-ItemProperty别名clv Clear-Variable别名cpi Copy-Itemp C: \ >

发现别名Cmdlets

几个别名cmdlet使您能够定义新的别名、导出别名、导入别名和显示现有别名。通过使用以下命令,您可以得到所有相关的别名cmdlet的列表:

PS C:\> get-command *-AliasCommandType名称定义----------- ---- ----------导出别名导出别名[-路径]<字符串…Cmdlet Get-Alias Get-Alias [[-Name] Cmdlet Import-Alias Import-Alias [-Path] Cmdlet New-Alias New-Alias [-Name] […Cmdlet Set-Alias Set-Alias [-Name] […

您已经看到了如何使用混叠cmdlet生成当前PowerShell会话中可用的别名列表。的Export-AliasImport-Aliascmdlet用于从一个PowerShell会话向另一个PowerShell会话导出和导入别名列表。最后,新别名Set-Aliascmdlet允许您为当前PowerShell会话定义新的别名。


注意:PowerShell中的别名实现是有限的。如前所述,别名只对cmdlet或可执行文件有效,用于与参数一起使用的cmdlet和可执行文件。但是,有一些方法可以解决这个限制。一种方法是在变量中定义命令,然后从其他命令调用该变量。方法的问题是,该变量只能在当前PowerShell会话中调用,除非在profile.ps1文件。第二种(首选的)方法是将命令放在函数中。


创造持久的别名

当您使用时创建的爱丽丝新别名Set-Aliascmdlet仅在当前PowerShell会话中有效。退出PowerShell会话将丢弃任何现有别名。要使别名跨PowerShell会话持久存在,必须在profile.ps1文件,如下例所示:

set-alias new new-objectset-alias time get-date…

虽然命令缩短很有吸引力,但不推荐广泛使用别名。一个原因是别名不能很好地移植到脚本中。例如,如果您在脚本中使用了大量别名,则必须包含aSet-Aliases在脚本开始时进行排序,以确保在脚本运行时,不管机器或会话配置文件是什么,这些别名都存在。

然而,比可移植性更令人担忧的是别名常常会混淆或模糊命令或脚本的真正含义。您定义的别名可能对您有意义,但并不是每个人都认同您定义别名的逻辑。因此,如果您希望其他人理解您的脚本,您必须小心不要使用太多别名。相反,应该考虑创建可重用的函数。


注意:在为脚本创建别名时,使用其他人可以理解的名称。例如,除了对脚本进行编码之外,没有理由创建仅由两个字母组成的别名。


创建第一个脚本

本章介绍的大多数命令都是交互式的,即在PowerShell提示符下输入命令,然后返回输出。尽管交互式地使用PowerShell对于只需要执行一次的任务很有帮助,但是它并不是执行重复的自动化任务的有效方法。幸运的是,PowerShell能够读取包含已存储命令的文件,这使您能够在需要时编写、保存和收回一系列命令。这些存储的命令序列通常被称为脚本。

PowerShell脚本仅仅是存储在a中的文本文件.ps1扩展。您可以使用任何文本编辑器(如记事本)来创建包含命令的文本文件,这些命令构成了PowerShell脚本。例如,打开记事本,输入以下命令:

get-service | where-object{$_。情商“停止”}

接下来,用名称保存这个文件ListStoppedServices.ps1在您选择的目录中。对于本例,C: \脚本使用目录。

在运行这个脚本之前,您需要调整PowerShell的执行策略,因为默认设置不允许运行针对恶意脚本的脚本保护。若要更改此设置,请使用Set-ExecutionPolicycmdlet,如下面的示例所示。你也可以用Get-ExecutionPolicy验证当前执行策略的cmdlet。(第5章更详细地讨论了PowerShell的安全性和最佳实践。)

PS C:\>设置执行策略的远程设置p C: \ > get-executionpolicyRemoteSignedp C: \ >

RemoteSigned策略允许在本地创建的脚本在没有数字签名的情况下运行,但是仍然需要从Internet下载的脚本进行数字签名。这些设置为您提供了从本地机器运行未签名脚本的灵活性,但是,它们提供了一些针对未签名外部脚本的保护。

将PowerShell的执行策略更改为RemoteSigned,您可以在任何PowerShell会话中运行脚本,只需输入脚本的完整目录路径和文件名。在下面的示例中,输入C: \ \ ListStoppedServices.ps1的脚本命令产生以下输出:

p C: \ > C: \ \ ListStoppedServices.ps1的脚本地位DisplayName的名字------ ---- -----------停止报警器报警器停止AppMgmt应用程序管理停止aspnet_state ASP。净状态服务停止比特后台智能传输…停止浏览器p C: \ >
相关:
123.4 第3页
第3页共4页
工资调查:结果在