PowerShell初探(一)
PowerShell初探(一)
摘抄自:https://docs.microsoft.com/zh-cn/powershell/scripting/overview?view=powershell-7.2
概述
PowerShell 是一种跨平台的任务自动化解决方案,由命令行 shell、脚本语言和配置管理框架组成。
作为一种脚本语言,PowerShell 通常用于自动执行系统管理。 它还用于经常在 CI/CD 环境中生成、测试和部署解决方案。
如何启动 PowerShell?
- 单击“Windows PowerShell”快捷方式启动了 PowerShell 控制台;
- 右击“Windows PowerShell”快捷方式,选择“Run as administrator"
PowerShell 中的三个核心 Cmdlet
-
Get-Command
-
Get-Command
的作用是帮助查找命令。Get-Command -Noun Process
-
-
Get-Help
-
Get-Help
是多用途命令。Get-Help
帮助你了解找到命令后如何使用它们。Get-Help -Name Get-Help
-
-
Get-Member
-
Get-Member
可帮助发现可用于命令的对象、属性和方法。 -
Get-Service -Name w32time
方法
方法是可执行的操作。 使用 MemberType 参数来缩小
Get-Member
的结果范围,使其仅显示Get-Service
的方法。Get-Service -Name w32time | Get-Member -MemberType Method
正如所见,存在多种方法。 Stop 方法可用于停止 Windows 服务。
(Get-Service -Name w32time).Stop()
-
管道
一个命令的输出可以用作另一个命令的输入。例如:
Get-Service -Name w32time | Stop-Service
$CustomObject |
Select-Object -Property @{name='Name';expression={$_.Service}} |
Stop-Service
别名
获取别名gcm全称
Get-Alias -Name gcm
Output
--------------
CommandType Name Version Source
----------- ---- ------- ------
Alias gcm -> Get-Command
获取命令别名
Get-Alias -Definition Get-Command, Get-Member
Output
-------------
CommandType Name Version Source
----------- ---- ------- ------
Alias gcm -> Get-Command
Alias gm -> Get-Member
比较运算符
例如:
'PowerShell' -eq 'powershell'
Output
--------------
True
'PowerShell' -like '*shell'
Output
--------------
True
'PowerShell' -match '^*.shell$'
Output
--------------
True
#存储1~10于Numbers,查看是否包含15
$Numbers = 1..10
$Numbers -contains 15
#字符替换,默认情况下,-Replace 运算符不区分大小写,而 Replace() 方法区分大小写。
'SQL Saturday - Baton Rouge' -Replace 'saturday','Sat'
Output
--------------
SQL Sat - Baton Rouge
脚本编写
脚本只是在 PowerShell 控制台中以交互方式运行的相同或类似命令,只不过它们保存为 .PS1
文件。 可以使用一些脚本构造,如 foreach
循环,而不是 ForEach-Object
cmdlet。
PowerShell 的一大优势是,确定了如何为某个项执行某些操作后,就可以很容易地为数百个项执行相同的任务。 只需使用 PowerShell 中多种不同类型的循环之一循环访问这些项即可。
ForEach-Object
ForEach-Object
是用于循环访问管道中的项的 cmdlet,例如使用 PowerShell 单行命令。 ForEach-Object
通过管道流式处理对象。
虽然 Get-Command
的 Module 参数接受作为字符串的多个值,但仅通过管道输入按属性名称或通过参数输入接受这些值。 在下面的情形中,如果我想通过管道将两个字符串按值传递到 Get-Command
,以便与 Module 参数一起使用,则需要使用 ForEach-Object
cmdlet。
'ActiveDirectory', 'SQLServer' |
ForEach-Object {Get-Command -Module $_} |
Group-Object -Property ModuleName -NoElement |
Sort-Object -Property Count -Descending
Output
--------------
Count Name
----- ----
147 ActiveDirectory
82 SqlServer
在前面的示例中,$_
为当前对象。 从 PowerShell 版本 3.0 开始,可以使用 $PSItem
而不是 $_
。
函数
PowerShell 中有一个批准的谓词的特定列表,可通过运行 Get-Verb
获取这些谓词。
Get-Verb | Sort-Object -Property Verb
简单函数
PowerShell 中的函数使用函数关键字声明,后面依次跟函数名称、左大括号和右大括号。 函数将执行的代码包含在这些大括号中。
function Get-Version {
$PSVersionTable.PSVersion
}
Get-Version
Output
--------------
Major Minor Build Revision
----- ----- ----- --------
5 1 14393 693
高级函数
添加 CmdletBinding
以将函数转换为高级函数。
function Test-MrCmdletBinding {
[CmdletBinding()] #<<-- This turns a regular function into an advanced function
param (
$ComputerName
)
Write-Output $ComputerName
}
脚本模块
将以下两个函数保存在名为 MyScriptModule.psm1
的文件中。
function Get-MrPSVersion {
$PSVersionTable
}
function Get-MrComputerName {
$env:COMPUTERNAME
}
可以用 Import-Module
cmdlet 手动导入文件。
Import-Module C:\MyScriptModule.psm1
来自:https://mikefrobbins.com/2013/07/04/how-to-create-powershell-script-modules-and-module-manifests/
将函数另存为 ps1 文件,我点源将这些函数加载到内存中,但我想与其他人共享此工具,以便从中创建模块更有意义。
我只是将现有的 ps1 文件作为 psm1 文件保存在我的模块文件夹中同名的文件夹中,如下图所示:
使文件的文件夹和基本名称相同非常重要。我给它起了一个通用名称,因为我可能想在未来向这个相同模块的新版本中添加更多功能。我称它为 MrAuditTool.
此时,它是一个脚本模块。我们可以看到它包含了哪些命令: