Fork me on GitHub

PowerShell初探(一)

PowerShell初探(一)

摘抄自:https://docs.microsoft.com/zh-cn/powershell/scripting/overview?view=powershell-7.2

概述

PowerShell 是一种跨平台的任务自动化解决方案,由命令行 shell、脚本语言和配置管理框架组成。

作为一种脚本语言,PowerShell 通常用于自动执行系统管理。 它还用于经常在 CI/CD 环境中生成、测试和部署解决方案。

如何启动 PowerShell?

  1. 单击“Windows PowerShell”快捷方式启动了 PowerShell 控制台;
  2. 右击“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 文件保存在我的模块文件夹中同名的文件夹中,如下图所示:

创建-modules2d.png

使文件的文件夹和基本名称相同非常重要。我给它起了一个通用名称,因为我可能想在未来向这个相同模块的新版本中添加更多功能。我称它为 MrAuditTool.

此时,它是一个脚本模块。我们可以看到它包含了哪些命令:

创建-modules3a.png

posted @ 2021-12-23 21:27  浩然哉  阅读(111)  评论(0)    收藏  举报
/* 看板娘 */
浏览器标题切换
浏览器标题切换end