第4-6章-4运行命令5使用提供程序6管道连接命令

第4章 运行命令

4.1 无需脚本,仅仅是运行命令

  使用PowerShell,你输入一个命令,然后通过添加一些参数来定制化命令行为,单击返回,立刻就能看到结果。
  最终,你会厌倦一遍遍输入同样的命令(和参数),然后你会将其复制粘贴到一个文本文件中,并将文件的扩展名更名为.PS1,然后你瞬间就拥有了一个“PowerShell脚本”。

4.2 剖析一个命令

4.3 Cmdlet命名惯例

  微软已经为Cmdlet建了一个命名惯例。因此同样的命名规则也应该被用于函数和工作流。虽然微软并没有强制要求,但开发人员应该遵循该惯例。
  规则应该以标准的动词开始,比如Get、Set、New或Pause。在动词之后中紧接着一个破折号,然后是一个单数形式的名词,比如Service或Process或EventLog。

4.4 别名:命令的昵称

  别名仅仅是命令的昵称。
get-alias -Definition "Get-Service"
  无论是否使用别名,命令的工作方式不会变。参数还是原来的参数,其他部分也不会有任何改变——仅仅是命令名称变得更短。如果你习惯使用UNIX或Linxu,就会知道别名也可以包含一些参数,只是记住PowerShell并不是以这种方式工作。

4.5 使用快捷方式

4.5.1 简化参数名称

  PowerShell并不强制要求输入完整的参数名称。例如,你可以通过输入-comp代替-ComputerName,简化的规则是必须输入足够的字母让PowerShell可以识别不同参数。

4.5.2 参数名称别名

  尽管参数的别名不在帮助文件或任何方便查阅的地方而难以识别,但参数也拥有别名。比如说,Get-Eventlog命令有-ComputerName参数。可以运行下述命令,查阅该参数别名。
(get-command get-eventlog | select -ExpandProperty parameters).computername.aliases
  Tab键补全会展示出-Cn这个别名。

4.5.3 位置参数

  对于位置参数来说,你无须输入参数名称——仅需要在正确的位置提供参数值。

4.6 小小作弊一下:Show-Command

  尽管我们拥有多年使用PowerShell的经验,但命令语法的复杂度有时依然会让我们抓狂。PowerShell v3提供的一个非常棒的特性是Show-Command comlet。如果你在命令语法方面遇到困难,包括空格、破折号、引号或是其他方面,Show-Command将成为你的助手。该命令允许你指定你无法用对的命令名称,并以图形化的方式将命令的参数名称展示出来。

4.7 对扩展命令的支持

  但是你并不会被局限在仅仅使用随PowerShell一同发行的Cmdlet——你还可以使用一些或许你已经使用多年的外置命令行工具,包括Ping、Nslookup、Ipconfig、Net等。
  在非Windows操作系统中也是如此:你可以使用grep、bash、sed、awk、ping以及任何可用的命令行工具。这些命令可以正常执行,PowerShell能够以传统shell同样的方式展示输出结果。

第5章 使用提供程序

5.1 什么是提供程序

  一个PowerShell提供程序,或者说PSProvider,其本质上是一个适配器。它可以接受某些数据存储,并使得这些介质看起来像是磁盘驱动器一样。你可以使用下面的命令查看当前Shell中已经存在的提供程序。
Get-PSProvider
  我们可以通过模块或者管理单元将一些提供程序添加到PowerShell中,这也是PowerShell仅支持的两种扩展方式。有些时候,如果启用了某些PowerShell功能,可能也会新增一个PSProvider。
  我们可以看出每个提供程序都有各自不同的功能。这非常重要,因为这将决定我们如何使用这些提供程序。下面是常见的一些功能描述。

  • ShouldProcess——这部分提供程序支持-WhatIf和-Confirm参数,保证我们在正式执行这部分脚本之前可以对它们进行测试。
  • Filter——在Cmdlet中操作提供程序的数据时,运行-Filter参数。
  • Credentials——该提供程序允许使用可变更的凭据连接数据存储。这也就是-Credentials参数的作用。
  • Transactions——该提供程序支持事务,也就是允许你在该提供程序中将多个变更作为一个原子操作进行提交或者全部回滚。
      大多数情况下,操作PSDrive的cmdlet名词部分都会包含“Item”。
    Get-Command -noun *Item*

5.2 FileSystem的结构

  Windows主要由3种对象组成:磁盘驱动器、文件夹和文件。磁盘驱动器是最上层的对象,包含文件夹和文件。文件夹是一种容器对象,它可以包含文件以及其他文件夹,文件不是一种容器对象,该对象处于层级的末尾。
  PowerShell中的术语和文件系统中的略有不同。因为PSDrive可能不是指向某个文件系统——比如PSDrive可以映射到注册表,所以PowerShell并不会使用“文件”以及“文件夹”的说法。相反,PowerShell采用更通俗的说法——“项”(Item)。一个文件或者一个文件夹都叫做项,尽管本质上是两种不同的项。这也就是为什么前面返回的Cmdlet名字中都有“Item”字符。
  每个项基本上都会存在对应的属性。

  • 比如Clear、Copy、Get、Move、New、Remvoe、Rename以及Set等动词可以应用于这些项(比如文件或文件夹)以及它们对应的属性。
  • Item名词对应的是单独对象,比如文件或文件夹
  • ItemProperty代表一个项对应的属性。比如只读、项创建时间、长度等。
  • ChildItem名词对应一个项(比如文件或文件夹)包含于另一个项(文件夹)中
      需要记住的是,这些Cmdlet都通用的,因为它们需要处理各种不同的数据源。

5.3 理解文件系统与其他数据存储的类似之处

  文件系统可以算作其他数据存储的模板。

5.4 使用文件系统

  在使用提供程序时,需要熟悉的另外一个Cmdlet是Set-Location。该参数的功能是将Shell中当前路径变更为不同路径,比如变更到另一个文件夹下。

PS C:\> Set-Location -Path C:\Windows
PS C:\Windows>

  cd是Set-Location的别名
  PowerShell中另外一个比较棘手的任务是创建新的项。比如,如何新建一个新的目录。运行New-Item,将会返回一个意外的提示。

PS C:\Users\gaizai> New-Item testFolder 
Type: 

  需要注意的是,New-Item这个Cmdlet在很多地方都是通用的——它根本无法得知你是想新建一个文件夹。这个Cmdlet可以用来新建文件夹、文件、注册表以及其他项,所以你必须告知你希望创建的类型是什么。

PS C:\Users\gaizai> New-Item testFolder
Type: Directory

  PowerShell中也包含MKDir命令。很多人都认为该命令是New-Item的别名,但使用MKDir并不需要输入类型。内部实现上,MKDir是一个函数,而不是一个别名。

5.5 使用通配符与字面路径

  大部分项的Cmdlet都包含了-Path属性。默认情况下,该属性支持通配符输入。
  “*”通配符代表0个或者多个字符,“?”通配符仅代表单个字符。你应该曾经多次使用过这两种通配符,当然你可能使用的是Get-ChildItem的别名Dir。
PS C:\Windows> Dir *.exe
  在大部分其他类型的数据存储中,“*”和“?”都可以包含在Item的名称中。比如,在注册表中,你可以看到一些项的名称中包含“?”字符。针对此问题,PowerShell给出的解决办法是新增一个参数 -LiteralPath。该参数并不支持通配符。如果需要查询名字中带有*或者?,就要使用-LiteralPath参数,而不要使用-Path。

5.6 使用其他提供程序

  如果相对其他提供程序有个大致的认识,以及了解其他项的工作Cmdlet如何工作,最好的办法就是云尝试一下非文件系统格式的PSDrive。以注册表为例,下面的例子中,我们最终要达成的目标是关闭Windows中的桌面透明特性。
  我们现在先将路径银的到 HKEY_CURRENT_USER,在PowerShell中显示为HKCU:驱动器。
PS C:\Windows> Set-Location -Path HKCU:
  接下来,看注册表的右边。

PS HKCU:\> Set-Location -Path Software
PS HKCU:\Software> Get-ChildItem
PS HKCU:\Software> Set-Location Microsoft
PS HKCU:\Software\Microsoft> Get-ChildItem
PS HKCU:\Software\Microsoft> Set-Location .\Windows
PS HKCU:\Software\Microsoft\Windows> Get-ChildItem

你可以在该列表中看到EnableWindowColorization的键值,现在将它修改为0。

PS PS HKCU:\Software\Microsoft\Windows> Set-ItemProperty -Path DWM -PSProperty EnabelWindowColorization -Value 0

下面再执行之前的命令来确认修改已经生效。
PS PS HKCU:\Software\Microsoft\Windows> Get-ChildItem

第6章 管道:连接命令

6.1 一个命令与另一个命令连接:为你减负

  PowerShell通过管道把命令互相连接起来。管道通过传输一个命令,把其输出作为另外一个Cmdlet的输入,使得第二个命令可以通过第一个的结果作为输入并联合起来运行。

6.2 输出结果到CSV或XML文件

6.2.1 输出结果到CSV

  管道和另外一个命令可以在导出文件时派上用场。
Get-Process | Export-CSV procs.csv
  你可以把几乎所有的“Get-Cmdlet”用管道传输到“Export-CSV”,然后输出结果。同时,你应该意识到CSV文件包含了比显示到屏幕时更多的信息,因为Shell知道不可能把所有信息全部显示到屏幕中,所以它使用微软提供的配置文件,把最重要的部分显示到屏幕上。在本章的后面,我们会展示如何覆盖默认配置从而显示你期望的输出结果。
  一旦信息保存到CSV文件,就可以轻易地以附件形式发送给同事并让其在PowerShell中查看。只需要用下面的命令把文件导入即可。
Import-CSV procs.csv

6.2.2 输出结果到XML

  PowerShell还提供了“Export-CliXML”Cmdlet,用于创建常规的命令行界面可扩展标记语言文件。CliXML是PowerShell专用的,但任何能够解析XML文件的程序都能够读取它。所有的import和export的Cmdlet都 需要提供文件史作为必要参数。

6.2.3 对比文件

  实际上,“Compare-Object”可以在展示、共享信息时发挥重要作用。我们会用到它的别名:Diff。
  首先,运行“help diff”并阅读相关帮助信息。注意3个参数:ReferenceObject,DifferenceObject和-Property。
  Diff用于把两个结果集组合在一起并进行对比。
  下面,在对照计算机上运行:
Get-Process | Exprot-CliXML reference.xml
  然后把XML文件传输到差异计算机,运行:

Diff -reference (Import-CliXML reference.xml)
-difference (Get-Process) -Property Name

6.3 管道传输到文件或打印机

Dir > DirectoryList.txt
  其中“>”符是PowerShell身后兼容旧版本cmd.exe命令的一个快捷方式。而实际上,当运行这个命令时,PowerShell底层会以下面的方式实现。
Dir | Out-file DirectoryList.txt
  当你运行“Dir”时,实际上是在运行“Dir | Out-Default”。“Out-Default”只是把内容指向“Out-Host”,意味着你在无意中运行了:
Dir | Out-Default | Out-Host

6.4 转换成HTML

  "ConvertTo-HTML"命令可以生成结构良好、通用的HTML数据,并可以在任何Web浏览器中打开。注意,该命令不需要文件名。
  你应该怎么把HTML存入磁盘的文本文件上?
Get-service | ConvertTo-HTML | Out-file services.htm

6.5 使用Cmdlets修改系统:终止进程和停止服务

  带有相同名词的Cmdlets可以在彼此之间互传信息。通常情况下,你最好是带上特定进程名称而不是终止全部进程。
Get-Process -name Notepad | Stop-Process
  这些Cmdlets以某些方式修改系统,并且有一个内部定义的影响级别(impact level)。Cmdlet的创建者已经设定了这些影响级别,并且不允许修改。而Shell有一个相应的“$ConfirmPreference”设置,默认为“high”。可以通过下面的命令查看你的Shell的设置。
PS C:\> $ConfirmPreference
  但是如果你喜欢它问题弹出,可以使用下面的命令。
Get-Service | Stop-Service -confirm
  我们在这里加了“-confirm”参数,对于某些被支持的用于修改系统的Cmdlet,会弹出提示,并对这些被支持的Cmdlet显示对应的帮助文档。
  另外一个类似的参数是“Whatif”,可用于支持“Confirm”的Cmdlet。它会告诉你哪些Cmdlet会被执行,但是并不真正运行。这个功能为那些可能有潜在风险的Cmdlet的预览提供了很好的帮助,并且可以检查是否是你想要的结果。

posted @ 2023-02-04 15:46  Evan-whc  阅读(47)  评论(0编辑  收藏  举报