Powershell基础入门与实例初识
[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 具有名为 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:UsersWeiyiGeek> "ls"
ls
PS C:UsersWeiyiGeek> &"ls"
# 目录: C:UsersWeiyiGeek
# 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-testTestScript.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 并将其作为工作流运行。 |
- Android系统层Watchdog机制源码分析
- 算法之插入排序
- Android Studio环境下搭建ReactNative
- Android实现两个ScrollView互相联动,同步滚动的效果
- 一个可以拖动的自定义Gridview代码
- android图片加载库Glide
- 密码最短长度为7,其中必须包含以下非字母数字字符1 完美解决方案
- android开发性能分析
- url带中文参数显示乱码的问题
- 转换程序的一些问题:设置为 OFF 时,不能为表 'Test' 中的标识列插入显式值。8cad0260
- JQuery 对控件的事件操作
- 流畅地HtmlHelper-Asp.Net MVC
- 用Sql生成数据插入Sql脚本
- 利用反射自己写的一个ModelHelper类
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 比对得到的SAM文件怎么看?
- ANTNet|端侧架构,精度速度双超MobileNetV2
- 9个动图带你进入PyQtGraph的强大可视化世界
- 转录组分析 | 使用STAR进行比对
- 使用R/qtl进行QTL分析
- 转录组分析 | 使用RSEM进行转录本定量
- 使用R语言计算遗传力
- 专属于六倍体小麦的Bioconductor注释包
- 轻松上传超过100M的文件至GitHub
- 转录组分析 | 使用DESeq2进行基因差异表达分析
- 生信基础 | 使用BLAST进行序列比对
- 批量提取基因上下游指定范围内的SNP标记
- 一文掌握Plink文件格式转换
- R语言绘图 | 绘制QQ图和曼哈顿图
- GWAS | 使用GEMMA进行全基因组关联分析