[TOC]

0x00 前言简介

微软官网:PowerShell 是构建于 .NET 上基于任务的命令行 shell 和脚本语言。 PowerShell 可帮助系统管理员和高级用户快速自动执行用于管理操作系统(Linux、macOS 和 Windows)和流程的任务, 其实可以看做是C#的简化版本还与PHP语言有相似之处(语法),与我们可以采用ISE 集成脚本环境进行PS脚本脚本编写;

Powershell特点:

  • PowerShell 命令可以从命令行管理计算机(十分方便)。
  • PowerShell Core 支持 Windows、macOS 和 Linux 平台,一般运行在window7-window server 2012及以上自带的个人pc和服务器上使用普遍;
  • PowerShell 提供程序可让你访问数据存储(如注册表和证书存储),与你访问文件系统一样方便。
  • PowerShell 具有丰富的表达式分析器和完全开发的脚本语言
  • PowerShell 旨在消除长期存在的问题和添加新功能,从而改进命令行和脚本环境。
  • PowerShell 结合了交互式 shell 和脚本编写环境,可以访问命令行工具(命令系列是可扩展的)、COM 对象和 .NET 类库。
  • PowerShell 基于对象而非文本,所以输出是基于对象的。
  • PowerShell 基于.NET Framework 构建它与 C# 编程语言共享一些语法功能和关键字。
  • PowerShell 是开放源代码项目 Github

设计目标:

  • 可发现性:管理系统是一项复杂的任务。 具有一致的接口的工具有助于控制固有的复杂性
  • 一致性 : 管理系统是一项复杂的任务,具有一致的接口的工具有助于控制固有的复杂性
  • 交互式脚本编写环境: Windows 命令提示符提供了一个可访问命令行工具和基本脚本的交互式 shell, Windows 脚本宿主 (WSH)具有可编写脚本的命令行工具和 COM 自动化对象,但不提供交互式 shell。
  • 面向对象:PowerShell 基于对象而非文本
  • 交互式脚本编写环境:Windows 命令提示符提供了一个可访问命令行工具和基本脚本的交互式 shell
  • 轻松转换到脚本:借助 PowerShell 的命令可发现性,可以从以交互方式键入命令轻松转换为创建和运行脚本


PowerShell版本:

  • Windows PowerShell: 从 Windows 7 SP1 和 Windows Server 2008 R2 SP1 开始,每个 Windows 中默认随附安装有 Windows PowerShell。
    • PS 3.0 : Windows 7 SP1 (预装) / Windows 8默认安装
    • PS 4.0 : Windows 8.1
    • PS 5.0 : 已被 Windows PowerShell 5.1 取代
    • PS 5.1 : Windows 10 / Windows Server 2016
    • 6.0 / 7.0 : PowerShell Core:微软为了贴近Linux增加其系统的扩展性,在Windows中内置了Linux系统并且同时开源了PowerShell Core了,利用它我们就可以跨平台进行管理计算机了;

注意: Windows PowerShell 是为 .NET Framework 编写的,而 PowerShell Core 是为 .NET Core 编写的。 可移植模块是同时适用于 Windows PowerShell 和 PowerShell Core 的模块。


PowerShell系统要求

  • 操作系统要求: Windows 7 Service Pack 1~Windows Server 2019 (注意区间中的各个PS版本)
  • Microsoft .NET Framework 要求
    • PS 5.1 == .NET Framework 4.5
    • PS 5.0 == .NET Framework 4.5
    • PS 4.0 == .NET Framework 4.5
    • PS 3.0 == .NET Framework 4
    • PowerShell Core == .NET Core
  • Windows Management Framework 4.0
  • WS-Management 3.0
  • Windows Management Instrumentation 3.0
  • 公共语言运行时 4.0
  • 图形用户界面要求

参考网站:
Powershell Core : 新的PowerShell版本:https://aka.ms/pscore6
Micrisoft PowerShell Docs : https://msdn.microsoft.com/powershell/scripting/setup/windows-powershell-system-requirements
PowerShell 在线教程:https://www.pstips.net/powershell-online-tutorials


0x01 PS模式和快捷键

PS控制台有两种模式: 快速编辑模式和标准模式的切换可以通过控制台标题栏->鼠标右击->属性->选项->编辑选项

  • Powershell标准模式(默认):鼠标右击选择标记后才能实现复制和粘切功能。
  • Powershell快速编辑模式:可以通过鼠标左键选择任意矩形区域内的文本,并且鼠标右击实现复制功能。

Powershell的快捷键和cmd以及linux中的shell 都比较像。

PgUp PgDn 	显示当前会话的第一个命令和最后一个命令
Enter 执行当前命令
End 将光标移至当前命令的末尾
Del 从右开始删除输入的命令字符
Esc 清空当前命令行 (V)
ALT+F7 清除命令的历史记录 (V)
F2 自动补充历史命令至指定字符(例如历史记录中存在Get-Process,按F2,提示"Enter char to copy up to",键入‘s’,自动补齐命令:Get-Proce) (V)
F4 删除命令行至光标右边指定字符处 (V)
F7 对话框显示命令行历史记录
F8 检索包含指定字符的命令行历史记录
F9 根据命令行的历史记录编号选择命令,历史记录编号可以通过F7查看
左/右方向键 左右移动光标
上/下方向键 切换命令行的历史记录
Home 光标移至命令行最左端
Backspace 从右删除命令行字符
Ctrl+C 取消正在执行的命令
Ctrl+左/右方向键 在单词之间移动光标
Ctrl+Home 删除光标最左端的所有字符 (V)
Tab 自动补齐命令或者文件名


0x02 命名规则

描述:PowerShell 有一套推荐的标准谓词名,PS使用“谓词 - 名词”命名系统,每个 cmdlet 名称都由一个标准谓词、连字符和特定名词组成,一般的谓词与名称的首字母为大写(在编程中需要抱持良好的风格);

比如:PowerShell 具有Get-Process、Stop-Process、Get-Service 和 Stop-Service 一看就一目了然等命令。说白了原来您需要记忆100个命令现在只需要10个谓词和 10 个名词就能搞定;
PowerShell 利用这些相似之处减少了解和使用 cmdlet 时需要知道的不同名称的数量。

Cmdlet 使用标准参数以及命令名称

  • PS标准化参数分隔符,参数名称前面始终带有“-”
    • Get-Command -Name Clear-Host

  • 帮助参数 (?):在任何 cmdlet 上指定 -? 参数时,PowerShell 将显示该 cmdlet 的帮助。
    • Get-Service -?

  • 通用参数: 参数由 PowerShell 引擎控制, 通用参数的行为方式始终相同。
    • 通用参数: WhatIf、Confirm、Verbose、Debug、Warn、ErrorAction、ErrorVariable、OutVariable 和 OutBuffer

  • 建议的参数名称:PowerShell 核心 cmdlet 使用标准名称
    • 指示计算机的参数的建议名称是 ComputerName,而不是 Server、Host、System、Node 或其他常见的备选单词。 其他重要的建议参数名称是 Force、Exclude、Include、PassThru、Path 和 CaseSensitive。

  • PS支持别名以通过备用名称引用命令(Get-Alias获取别名),别名将新名称与其他命令关联。
    • 例如,PS 具有名为 Clear-Host 的内部函数,该函数清空输出窗口。 可以在命令提示符下键入cls 或 clear 别名, PS解释这些别名并运行Clear-Host 函数

  • 解释标准别名:PS 别名尝试兼顾清晰度和简洁性(可以进行缩写-进截取谓词第一个字母和名词的前两个字母)
    • 比如: 熟悉 PowerShell 别名后就很容易猜到 sal 别名指的是 Set-Alias , 又比如gcm等同于Get-Command


PS 支持几种其他类型的命令:

  • 别名:Alias
  • 功能:Function
  • 脚本:Script

备注:

  • 在 PowerShell v6 之前 sc 是 Set-Content cmdlet 的别名。
  • 因此若要在 v6 之前的 PowerShell 版本中运行 sc.exe 命令,必须使用包含文件扩展名 exe的完整文件名 sc.exe。
  • 外部可执行文件,或具有已注册的文件类型处理程序的文件也被归类为命令。

0x03 基础命令

描述:Windows PowerShell 引入了 cmdlet(读作command-let)的概念,它是内置于 Shell 的简单的单一函数命令行工具。
Windows PowerShell 包括一百多个基本核心 cmdlet 你可以编写自己的 cmdlet 并与其他用户共享。

启动PowerShell非常简单直接在CMD命令行之中:

  • PowerShell

  • PowerShell_ISE

TIPS:默认键入一个字符串PS会将它原样输出,如果该字符串是一个命令或者启动程序,在字符串前加‘&’可以执行命令,或者启动程序。

PS C:\Users\WeiyiGeek> "ls"
ls
PS C:\Users\WeiyiGeek> &"ls"
# 目录: C:\Users\WeiyiGeek
# Mode LastWriteTime Length Name
# ---- ------------- ------ ----
# d----- 2019/7/26 8:45 .android
# d----- 2019/8/19 17:27 .config


Help 命令帮助

描述:若要一次显示每篇帮助文章的一页,请使用 help 函数或其别名 man

基础实例:

#1.例如,若要显示 Get-ChildItem cmdlet 的帮助信息
man Get-ChildItem
help Get-ChildItem


Get-Command 获取命令

描述:利用Get-Command可以采用通配符进行匹配查看

#0.查看指定的Cmdlet命令/Function的信息
PS> Get-Command -Name Clear-Host
# CommandType Name Version Source
# ----------- ---- ------- ------
# Function Clear-Host


#1.例如若要查找用于查看和更改 Windows 服务的 cmdlet 列表,请键入:
PS> Get-Command *-Service
PS> Get-Command -Noun Service #使用 Noun 参数查看将对同一类型的对象产生影响的命令系列,效果同上|
# CommandType Name Version Source
# ----------- ---- ------- ------
# Cmdlet Get-Service 3.1.0.0 Microsoft.PowerShell.Management
# Cmdlet New-Service 3.1.0.0 Microsoft.PowerShell.Management
# ...

#2.例如若要查看使用谓词 Get 的所有 cmdlet
PS> Get-Command -Verb Get # Verb 参数列出包含特定谓词的所有命令(以Get开头的Cmdlet命令)
# CommandType Name Version Source
# ----------- ---- ------- ------
# Alias Get-AppPackage 2.0.1.0 Appx
# Alias Get-AppPackageDefaultVolume 2.0.1.0 Appx


#3.获取有关命令的信息返回每个 cmdlet 语法的 Syntax 参数
PS> Get-Command Get-Help -Syntax
# Get-Help [[-Name] <string>] [-Path <string>] [-Category <string[]>] [-Component <string[]>] [-Functionality <string[]>] [-Role <string[]>] [-Full] [<CommonParameters>]


#4.使用 CommandType 参数可以获取其他类型的本机命令
Get-Command -CommandType [Alias|Function|Script]


Get-help 帮助命令

描述:可以利用Get-help来进行查找Powershell的命令帮助;

#1.例如,下面的命令显示 Get-Service cmdlet 的输出对象成员的相关信息。
Get-help Get-service
et-Help Get-Service -Online #若要联机查看此 cmdlet 的帮助主题,转到 https://go.microsoft.com/fwlink/?LinkID=113332
#备注:Get-Help 在此计算机上找不到该 cmdlet 的帮助文件它仅显示部分帮助。


#2.若要在会话中获取所有 cmdlet 帮助文章的列表,请键入
Get-Help -Category Cmdlet
Get-Help Get-ChildItem -Detailed #若要显示详细信息,请使用Detailed 参数
Get-Help Get-ChildItem -Full #若要显示帮助文章中的所有内容,请使用 Full 参数
Get-Help Get-ChildItem -Parameter * #若要获取有关 cmdlet 的参数的详细帮助,请使用的 Parameter 参数

#3.获取Cmdlet命令显示帮助文章中的示例,
Get-Help Get-ChildItem -Examples

#4.获取有关脚本和函数的帮助
Get-Help c:\ps-test\TestScript.ps1 # 但是在运行 Get-Help * 时不会显示函数和脚本的帮助


Update-Help 更新帮助

描述:若要下载并安装包含此 cmdlet 的模块的帮助文件,请使用 Update-Help。

Update-Help Get-service

WeiyiGeek.


Get-Alias 获取别名

描述:Get-Alias cmdlet 显示与别名关联的本机 PowerShell 命令的真实名称。

#1.获取别名的真实命令
PS > Get-Alias cat
# CommandType Name Version Source
# ----------- ---- ------- ------
# Alias cat -> Get-Content
PS > Get-Alias cls
# Alias cls -> Clear-Host

WeiyiGeek.


Set-Aliase 设置别名

描述:可以使用 Set-Alias cmdlet 创建自己的别名。

#1.PS设置别名样式
Set-Alias -Name gi -Value Get-Item

注意: PS内置别名无法被修改,否则会报错 Set-Alias :别名不可写入,因为别名 gi 为只读别名或常量,无法写入。


0x0n PS术语表

术语 定义
二进制模块 一个 PS 模块其根模块是一个二进制模块文件 (.dll)。 二进制模块可能包含或不包含模块清单。
通用参数 一个参数它由 PS 引擎添加到所有 cmdlet、高级函数和工作流中。
使用点获取来源 在 PS 中若要启动一个命令,可在该命令前键入一个点和一个空格。 采用点获取其来源的命令运行在当前范围而非新范围中。 命令创建的任何变量、别名、函数或驱动器都创建于当前范围,并在命令完成时提供给用户。
动态模块 一个仅存在于内存中的模块。 New-Module 和 Import-PSSession cmdlet 会创建动态模块。
动态参数 在某些情况下添加到 PS cmdlet、函数或脚本的一个参数。 Cmdlet、函数、提供程序和脚本可以添加动态参数。
格式设置文件 一个 PS XML 文件,它具有 .format.ps1xml 扩展名且定义 PS 如何基于对象的 .NET Framework 类型来显示对象。
全局会话状态 包含 PS 会话用户可访问的数据的会话状态。
主机 PS 引擎用于与用户进行通信的接口。 例如,主机指定 PS 和用户之间处理提示的方式。
主机应用程序 将 PS 引擎加载到其进程中并使用它执行操作的程序。
输入处理方法 Cmdlet 可用于处理其以输入形式所接收的记录的一种方法。 输入处理方法包括 BeginProcessing 方法、ProcessRecord 方法、EndProcessing 方法以及 StopProcessing 方法。
清单模块 一个 PS 模块,它具有一个清单且其 RootModule 项为空。
模块清单 一个 PS 数据文件 (.psd1),描述模块的内容并控制模块的处理方式。
模块会话状态 包含 PS 模块公用和专用数据的会话状态。 此会话状态中的私有数据不可供 PS 会话的用户使用。
非终止错误 不能阻止 PS 继续处理命令的错误。
名词 在 PS cmdlet 名称中连字符后面的单词。 名词描述了 cmdlet 在其上进行操作的资源。
参数集 可用于相同的命令中以执行特定操作的一组参数。
在 PS 中,将前一个命令的结果作为输入发送到管道中的下一个命令。
管道 一系列由管道运算符 (` `) (ASCII 124) 连接的命令。 每个管道运算符将前一个命令的结果作为输入发送到下一个命令。
PSSession 一种由用户创建、管理和关闭的 PS 会话类型。
根模块 在模块清单的 RootModule 项中指定的模块。
运行空间 在 PS 中,在其中执行管道中每个命令的操作环境。
脚本块 在 PS 编程语言中,可作为单个单元使用的语句或表达式的一个集合。 脚本块可以接受参数并返回值。
脚本模块 一个 PS 模块,其根模块是一个脚本模块文件 (.psm1);脚本模块可能包含或不包含模块清单。
脚本模块文件 一个包含 PS 脚本的文件。 该脚本定义脚本模块导出的成员。 脚本模块文件具有 .psm1 文件扩展名。
shell 用于将命令传递到操作系统的命令解释器。
开关参数 一个不带实参的形参。
终止错误 阻止 PS 处理命令的错误。
事务 一个工作的原子单元,必须将事务中的工作作为一个整体来完成;如果该事务的任何部分失败,那么整个事务都会失败。
类型文件 一个 PS XML 文件,它具有.ps1xml 扩展名且扩展 PS 中 Microsoft.NET Framework 类型的属性。
动作 在 PS cmdlet 名称中连字符前面的单词,它说明该 cmdlet 将执行的操作。
PS 为IT管理员提供全面控制以及实现系统管理任务自动化的一个命令行 Shell 和基于任务的脚本技术;
PS命令 导致操作被执行的管道中的元素。PS 命令可以在键盘上输入或以编程方式调用。
PS数据文件 具有 .psd1 文件扩展名的文本文件。 PS 将数据文件用于多种用途,例如存储模块清单数据和存储用于脚本国际化的已翻译的字符串。
PS驱动器 一个提供直接访问数据存储的虚拟驱动器。 它可以由 PS 提供程序定义或是在命令行中创建。 在命令行创建的驱动器是特定于会话的驱动器,并在会话关闭时丢失。
PS集成脚本环境 (ISE) 一个 PS 主机应用程序,使你能够运行命令并在友好、语法着色、符合 Unicode 的环境中编写、测试和调试脚本。
PS模块 一个独立的可重用单元,使你能够对 PS 代码进行分区、组织和抽象化。 模块可以包含 cmdlet、提供程序、函数、变量和其他可作为单个单元导入的资源类型。
PS提供程序 一个基于 Microsoft .NET Framework 的程序,用于使专用数据存储中的数据在 PS 中可用,以便你可以查看和管理它。
PS脚本 以 PS 语言编写的脚本。
PS脚本文件 具有 .ps1 扩展名且包含以 PS 语言编写的脚本的文件。
PS管理单元 定义一组可以添加到 PS 环境中的 cmdlet、提供程序和 Microsoft .NET Framework 的资源。
PS工作流程 工作流是一系列经过编程的连接步骤,会执行长期运行的任务,或是需要在多个设备或托管节点之间协调多个步骤。
PS工作流使IT专业人员和开发人员可以按工作流的形式创作多设备管理活动序列,或工作流中的单个任务。 PS 工作流使你能够调整 PS 脚本和 XAML 并将其作为工作流运行。

形用户界面
Cmdlet

Out-GridView

Show-Command

Show-ControlPanelItem

Show-EventLog

参数