powershell 入门

    powershell是一个外壳,但并非同与cmd.exe,powershell具备内置的脚车编写语言,不过比cmd.exe更为灵活,灵活是指不多的语句就能够自动执行极其复杂的任务。javascript

    从安全角度考虑,默认状况下powershell并不会容许运行脚本,只能交换的来运行单个命令,若是启用了脚本编写,则可令powershell仅运行通过数字签名的脚本。html

    快速入门十大cmdletjava

 *       Get-Command 用于检索全部可用 cmdlet 的列表。shell

          Get-Help 用于显示有关 cmdlet 和概念的帮助信息。安全

*       Get-WMIObject 用于经过 WMI 来检索管理信息。ide

*       Get-EventLog 用于检索 Windows 事件日志。函数

*       Get-Process 用于检索单个活动进程或活动进程的列表。工具

*       Get-Service 用于检索 Windows 服务。测试

*       Get-Content 用于读入文本文件,将每行视为一个子对象。spa

*       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 窗口中都可用。或者,若是须要,也可将该函数作成独立的脚本,而后只需键入其路径和文件名便可执行该脚本。
相关文章
相关标签/搜索