powershell是一个外壳,但并不是同与cmd.exe,powershell具有内置的脚车编写语言,不过比cmd.exe更为灵活,灵活是指很少的语句就可以自动执行极其复杂的任务。
从安全角度考虑,默认情况下powershell并不会允许运行脚本,只能交换的来运行单个命令,如果启用了脚本编写,则可令powershell仅运行经过数字签名的脚本。
快速入门十大cmdlet
Get-Command 用于检索所有可用 cmdlet 的列表。
Get-Help 用于显示有关 cmdlet 和概念的帮助信息。
Get-WMIObject 用于通过 WMI 来检索管理信息。
Get-EventLog 用于检索 Windows 事件日志。
Get-Process 用于检索单个活动进程或活动进程的列表。
Get-Service 用于检索 Windows 服务。
Get-Content 用于读入文本文件,将每行视为一个子对象。
Add-Content 用于将内容附加到文本文件。
Copy-Item 用于复制文件、文件夹和其他对象。
Get-Acl 用于检索访问控制列表 (ACL)。
所有的cmdlet都是以“动词-名词”格式命名,便于记忆
例如:Get-Command
该命令将会列出所有cmdlet列表
cmdlet甚至有快捷名称,称为别名,对于Get-WMIObject,只要键入gwmi即可,运行Get-Alias将列出快捷名称列表。
powershell是在MS Microsoft® .NET Framework 构建的,所以完全是面向对象的,面向对象对于管理员的好处就是节省大量时间,因为只需在基于文的外壳内就能直接处理丰富的对象。
例:
Get-process | Sort-Object pm -desc | Select -Object -first 10
使用管道将三个不同的命令组合使用,以上命令显示结果为机器上十大物理内存使用者。
powershell中的对象使用非常普遍,这全仰仗于它的变量,并且不必先声明变量,只需在变量名称前放置一个美元符号($)就可以使用它们了。尽管不是必需的,但您也可以将所要放入变量的数据类型告知 PowerShell。这使得 PowerShell 可以将变量映射到某一种极其强大的 .NET Framework 类型,从而为您提供诸多附加的内置功能。
例如,假设您想要提示输入计算机名称并从该计算机中检索服务包版本,但是您不知道键入的计算机名称是否会包括两个反斜线(如 \\Server2)。由于您知道 Get-WMIObject cmdlet 不需要反斜线,因此您可以将计算机名称保存到一个字符串变量中,然后使用 Replace 方法以空字符串替换反斜线,如下所示:
[string]$c = Read-Host "Enter computer name"
$c = $c.Replace("\","")
Get-WMIObject Win32_OperatingSystem
–Property ServicePackMajorVersion
–Computer $c
已在 $c 变量中提供了 –Computer 参数的值。该变量最初是作为字符串而创建的,因此它具有 .NET Framework 字符串类型的所有功能,包括 Replace 方法。
如果您键入 $c = $c.(不要忘了句号)并按 Tab,PowerShell 将显示 Clone(),这是字符串类型的第一个方法。如果您一直按 Tab,PowerShell 将会循环列出所有可用的方法。实质上,当您这样做时,PowerShell 是在向您展示它所知道的字符串处理方法。
然而,编写一行命令和参数无助于可读性。PowerShell 允许您将其拆分成更具可读性的形式,您甚至不用编写脚本就能将其直接键入外壳。这就是它可能的形式:
PowerShell 决不只有函数和 cmdlet。让我们以文件管理为例来快速了解一下其中还蕴藏着什么别的内容。您可能对 Cmd.exe 中的驱动器和文件夹导航再熟悉不过了 — 键入 C: 可切换到 C 驱动器,键入 cd \test 可转入 C:\Test 文件夹。PowerShell 的工作方式完全相同,不过 cd 只是 Set-Location cmdlet 的别名。
尝试运行 Get-PSDrive,该 cmdlet 会列出所有可用的驱动器。除了常用的 C:、D:(也许还有 A:)驱动器之外,您还会发现一个名为 Cert 的驱动器、另一个名为 Env 的驱动器以及其他名为 HKCU 和 HKLM 的驱动器。实际上,PowerShell 将许多不同类型的存储资源均以“驱动器”形式公开,从而使得诸如本地证书存储区、环境变量和注册表等资源均可通过一个象文件那样为大家所熟悉的导航界面来获得。键入 Set-Location HKLM:(或 cd hklm:,如果您喜欢使用快捷方式)而后按 Enter,可转到 HKEY_LOCAL_MACHINE 注册表配置单元。如果要删除某个表项,可使用 del 将其删除,就像该表项是文件或文件夹一样(不过一定要非常小心,如果删除了必需的表项或是对注册表进行了不正确地修改,可能会发生严重问题)。这一切灵活性均来自于提供程序,它们将资源(如注册表和证书存储区)映射成类似于文件系统那样的格式。Microsoft 计划通过另外的提供程序来扩展 PowerShell,例如,使您能够导航 Exchange Server 存储区,就像它是文件系统一样。这是一项非常重要的技术,重要性就在于它吸纳了 Windows 所使用的林林总总的存储库并使它们看起来全都相同,而且还使得它们都可以通过您已熟悉的命令和技术系统来进行管理。
PowerShell 在设计时很注重安全保护。PowerShell 中主要的安全功能是它的执行策略。默认情况下,此策略设置为“Restricted”,您可以通过运行 Get-ExecutionPolicy cmdlet 来进行验证。在 Restricted 模式下,不能运行脚本。就这么简单。由于这是默认模式,因此刚出盒的 PowerShell 不能用来运行脚本。
您可以使用 Set-ExecutionPolicy cmdlet 指定其他模式。我个人更偏爱 RemoteSigned 模式。在此模式下,可以运行未经数字签名的本地脚本(而非远程脚本),同时能够以最简单的方法开发和测试脚本。除非已使用受信任发布方所颁发的证书对脚本进行了数字签名,否则 AllSigned 模式不会运行任何脚本。最后,采用 Unrestricted 策略可运行任何脚本。我建议切莫采用此策略,因为以此方式打开的 PowerShell 会运行可能伺机找上您计算机的恶意脚本。请注意,执行策略也可能受组策略支配,它会替代所有本地设置(如果组策略设置正要替代您的本地设置,Set-ExecutionPolicy 会向您发出警告)。 另外,PowerShell 不会从当前目录运行脚本,除非您指定了该路径。这样设计是为了防止命令攻击。比如,某人创建了一个名为 IPConfig.ps1 的脚本(PS1 是 PowerShell 脚本文件的文件扩展名)。如果文件可在当前文件夹之外运行,则您可能会键入 ipconfig 而运行此用户所创建的脚本,可当时您其实是希望运行 Windows 程序 Ipconfig.exe,这样就带来了风险。由于 PowerShell 不会在当前文件夹之外运行脚本,所以这种错误不可能发生。如果您的确想在当前文件夹之外运行脚本,只需指定路径即可:例如 .\myscript。对当前文件夹的显式引用确保您知道自己正在运行脚本,而非外壳命令。
PowerShell 还具有使实验变得更加安全的功能。例如,请考虑(但请勿尝试)这个令人害怕的组合:
Get-Process | Stop-Process Get-Process cmdlet 会创建进程对象的集合并通过管道将其输送到 Stop-Process cmdlet,而后者真的会将它们停止!这会导致在大约 5 秒钟后出现蓝屏 STOP 错误,原因是终止了关键的 Windows 进程。但是,您可以通过添加非常方便的 –Whatif 参数来看看将会发生什么情况,而不会令其真的发生:Get-process | Stop-Process -Whatif
在 PowerShell 中运行此命令会产生一组语句,它们会告诉您 cmdlet 将会做什么,而不会真的让它们这样做。PowerShell 中的在线帮助系统(可通过 help 别名访问)尚未记载 –Whatif 参数,但请记住它。它是一个很好的工具,用于测试脚本和 cmdlet 以检验其结果,而不会实际做出任何具有潜在危害性和破坏性的事情。
PS C:\> $names = get-content "c:\computers.txt"PS C:\> foreach ($name in $names) {>> $name>> gwmi Win32_OperatingSystem -prop ServicePackMajorVersion -comp $name>> }>> 这一次,文件的内容存储在变量 $names 中。本例仍使用了 foreach,但它不是通过管道进行输入的,因此必须告知它需要循环处理哪个对象集合以及将每个对象存储在哪个变量中,即 ($name in $names) 所指明的那一部分。其他方面大体相同,只要您一按 Enter,就会执行代码并显示结果。如果要重复使用此同一代码,只需将其制成函数即可。再次将以下内容直接键入到外壳中:PS C:\> function Get-ServicePacks ($file) {>> $names = get-content $file>> foreach ($name in $names) {>> $name>> gwmi win32_operatingsystem -prop servicepackmajorversion -comp $name>> }>> }>> 如您所见,实际上并未做太多更改。只需将上一示例封入一个名为 Get-ServicePacks(与 PowerShell 的“动词-名词”命名惯例保持一致)的函数即可。该函数现在具有一个名为 $file 的输入参数,该参数在 Get-Content cmdlet 中已被取代,这样便可在运行函数时指定另一不同的文件。至此已定义了函数,运行它很简单,方法几乎与 cmdlet 一样,只需调用其名称并传递输入参数即可:PS C:\> Get-ServicePacks c:\computers.txt 其缺点在于此函数仅在该 PowerShell 实例运行期间才存在。一旦关闭外壳,该函数即会消失。您可以将该函数复制到您的 PowerShell 配置文件中,该配置文件是一种自动运行的脚本,它会在 PowerShell 每次启动时执行。这样做就使该函数在打开的每个 PowerShell 窗口中均可用。或者,如果需要,也可将该函数做成独立的脚本,然后只需键入其路径和文件名即可执行该脚本。
共同学习,写下你的评论
评论加载中...
作者其他优质文章