欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

powershell 视频教程 bilibili 有大用 有大大用

powerShell的优势:

一、扩展性: import-module

在Windows Server 2012中,已经大量扩展了基础角色的管理命令。

二、易用性:

1.语法:命令由动词和名词组成,例如: 

Get-EventLog

Set-Aduser

New-VM

2、利用Tab键自动补全命令。

3、PoxerShell快速入门]命令:

Get-command:支持通配符。

Get-Help: Windows Server 2012默认不包含详细信息,需要Update Help

4、自动向下兼容传命令行工具:利用别名实现,也可以自定义别名。

三、脚本的支持:可以在http://technet.microsoft com/zh-cn/的脚本中心获取脚本以及学习制作脚本

四、批量处理:灵活使用管道符“|”:

Get-ADUser | Where-0bject {$_.distinguishedname  -ilike "*ou=sales, dc=adatum, dc=com" }| Enable-Mailbox -database  "Mailbox Database 1"

五、轻松实现远程管理。

image.png

image.png

PS C:\Windows\system32> Import-Module ActiveDirectory   #导入 AD 模块

PS C:\Windows\system32>


image.png

PS C:\Windows\system32>New-ADUser        #新建 AD用户





来自  https://www.bilibili.com/video/BV1j44115727?p=2&vd_source=346847773d1f74962a4daab9ddf7f228   有大用



因为可能涉及到权限的问题,如下图,最好以管理员身份来运行 powershell

image.png





1) 算术运算计算

image.png

PS C:\Users\16666739> 1+1

2

PS C:\Users\16666739> 


image.png

PS C:\Users\16666739> $var1=1

PS C:\Users\16666739> $var2=2

PS C:\Users\16666739> $var1+$var2

3

PS C:\Users\16666739>


comlet是一种在powershell中使用的命令,, 由.net库编写,命令规范遵循 动词-名称 的格式

# Get-Process 获取当前进程

# Set-Location 切换目录,

# Get-Process:获取当前运行的进程。

# Set-ExecutionPolicy:设置脚本执行策略。

# New-Item:创建新的项(如文件、文件夹等)。



comlet  返回的是 .net对象


poweshell ,,,get-aduser 获取 用户名为 11111111 的用户信息,以表格显示出来

Import-Module ActiveDirectory  # 确保导入AD模块 

# 使用Get-ADUser获取用户信息,并通过Format-Table(或别名ft)以表格形式显示  

Get-ADUser -Filter "SamAccountName -eq '11111111'" | Format-Table Name, SamAccountName, UserPrincipalName, EmailAddress, DisplayName


旧版的cmd命令在powershell中通过别名链接到一个cmdlet命令,,,也有 linux 命令别名到cmdlet

别名 

cd --------------->   Set-Location

ls --------------->   Get-ChildItem

image.png

PS C:\Users\16666739> Get-Alias cd


CommandType     Name                                               Version    Source

-----------     ----                                               -------    ------

Alias           cd -> Set-Location



PS C:\Users\11111111>

image.png

PS C:\Users\16666739> Get-Alias   #查看所有别名


CommandType     Name                                               Version    Source

-----------     ----                                               -------    ------

Alias           % -> ForEach-Object

Alias           ? -> Where-Object

Alias           ac -> Add-Content

Alias           asnp -> Add-PSSnapin

Alias           cat -> Get-Content

Alias           cd -> Set-Location

Alias           CFS -> ConvertFrom-String                          3.1.0.0    Microsoft.PowerShell.Utility

Alias           chdir -> Set-Location

Alias           clc -> Clear-Content




image.png

PS C:\Users\11111111> Get-Command ls


CommandType     Name                                               Version    Source

-----------     ----                                               -------    ------

Alias           ls -> Get-ChildItem    #可以看出 ls 是别名



PS C:\Users\11111111>

image.png

PS C:\Users\16666739> Get-Command  get-ad*


CommandType     Name                                               Version    Source

-----------     ----                                               -------    ------

Cmdlet          Get-ADAccountAuthorizationGroup                    1.0.1.0    ActiveDirectory

Cmdlet          Get-ADAccountResultantPasswordReplicationPolicy    1.0.1.0    ActiveDirectory

Cmdlet          Get-ADAuthenticationPolicy                         1.0.1.0    ActiveDirectory

Cmdlet          Get-ADAuthenticationPolicySilo                     1.0.1.0    ActiveDirectory

Cmdlet          Get-ADCentralAccessPolicy                          1.0.1.0    ActiveDirectory

Cmdlet          Get-ADCentralAccessRule                            1.0.1.0    ActiveDirectory

Cmdlet          Get-ADClaimTransformPolicy                         1.0.1.0    ActiveDirectory

Cmdlet          Get-ADClaimType                                    1.0.1.0    ActiveDirectory

Cmdlet          Get-ADComputer                                     1.0.1.0    ActiveDirectory

Cmdlet          Get-ADComputerServiceAccount                       1.0.1.0    ActiveDirectory

Cmdlet          Get-ADDCCloningExcludedApplicationList             1.0.1.0    ActiveDirectory

Cmdlet          Get-ADDefaultDomainPasswordPolicy                  1.0.1.0    ActiveDirectory

Cmdlet          Get-ADDomain                                       1.0.1.0    ActiveDirectory

Cmdlet          Get-ADDomainController                             1.0.1.0    ActiveDirectory

Cmdlet          Get-ADDomainControllerPasswordReplicationPolicy    1.0.1.0    ActiveDirectory

Cmdlet          Get-ADDomainControllerPasswordReplicationPolicy... 1.0.1.0    ActiveDirectory

Cmdlet          Get-ADFineGrainedPasswordPolicy                    1.0.1.0    ActiveDirectory

Cmdlet          Get-ADFineGrainedPasswordPolicySubject             1.0.1.0    ActiveDirectory

Cmdlet          Get-ADForest                                       1.0.1.0    ActiveDirectory

Cmdlet          Get-ADGroup                                        1.0.1.0    ActiveDirectory

Cmdlet          Get-ADGroupMember                                  1.0.1.0    ActiveDirectory

Cmdlet          Get-ADObject                                       1.0.1.0    ActiveDirectory

Cmdlet          Get-ADOptionalFeature                              1.0.1.0    ActiveDirectory

Cmdlet          Get-ADOrganizationalUnit                           1.0.1.0    ActiveDirectory

Cmdlet          Get-ADPrincipalGroupMembership                     1.0.1.0    ActiveDirectory

Cmdlet          Get-ADReplicationAttributeMetadata                 1.0.1.0    ActiveDirectory

Cmdlet          Get-ADReplicationConnection                        1.0.1.0    ActiveDirectory

Cmdlet          Get-ADReplicationFailure                           1.0.1.0    ActiveDirectory

Cmdlet          Get-ADReplicationPartnerMetadata                   1.0.1.0    ActiveDirectory

Cmdlet          Get-ADReplicationQueueOperation                    1.0.1.0    ActiveDirectory

Cmdlet          Get-ADReplicationSite                              1.0.1.0    ActiveDirectory

Cmdlet          Get-ADReplicationSiteLink                          1.0.1.0    ActiveDirectory

Cmdlet          Get-ADReplicationSiteLinkBridge                    1.0.1.0    ActiveDirectory

Cmdlet          Get-ADReplicationSubnet                            1.0.1.0    ActiveDirectory

Cmdlet          Get-ADReplicationUpToDatenessVectorTable           1.0.1.0    ActiveDirectory

Cmdlet          Get-ADResourceProperty                             1.0.1.0    ActiveDirectory

Cmdlet          Get-ADResourcePropertyList                         1.0.1.0    ActiveDirectory

Cmdlet          Get-ADResourcePropertyValueType                    1.0.1.0    ActiveDirectory

Cmdlet          Get-ADRootDSE                                      1.0.1.0    ActiveDirectory

Cmdlet          Get-ADServiceAccount                               1.0.1.0    ActiveDirectory

Cmdlet          Get-ADTrust                                        1.0.1.0    ActiveDirectory

Cmdlet          Get-ADUser                                         1.0.1.0    ActiveDirectory

Cmdlet          Get-ADUserResultantPasswordPolicy                  1.0.1.0    ActiveDirectory



PS C:\Users\16666739>


image.png

PS C:\Users\16666739> Get-ADComputer  -filter *


image.png

PS C:\Users\16666739> Get-aduser  -filter *


image.png

PS C:\Users\16666739> get-aduser -filter * 

PS C:\Users\16666739> Get-ADUser -Filter "DistinguishedName -like '1111111*'"

PS C:\Users\16666739> Get-ADUser -Filter "DistinguishedName -like '*1111111*'"

PS C:\Users\16666739>  






image.png

#   Get-Process                                  #获取所有进程

#   Sort-Object CPU -Descending    #根据cpu的时间进行倒序排序

#   Select-Object -First 5                   #是获取前5个对象


PS C:\Users\16666739> Get-Process | Sort-Object CPU -Descending | Select-Object -First 5    #获取cpu占用率最高的前5个进程


Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName

-------  ------    -----      -----     ------     --  -- -----------

   1825      91   402920     268220     975.38  14384   1 chrome

   9638       0      196       1060     797.31      4   0 System

    928      40   695192     659376     686.64  15216   1 chrome

    545      26   865308     811052     677.81   3644   1 chrome

   3897     153   262480     211192     567.94   9672   1 chrome



PS C:\Users\16666739>



image.png

PS C:\Users\shipingzhong> Get-ChildItem $env:windir -Filter *.exe | Measure-Object -sum Length

#求出 C:\windows 下的 exe 文件的大小之和   


Count    : 12

Average  :

Sum      : 11062184

Maximum  :

Minimum  :

Property : Length




PS C:\Users\shipingzhong>

PS C:\Users\shipingzhong> Import-Csv data.csv | Where-Object {$_.age -gt 30} | ConvertTo-Html | Out-File output.html

PS C:\Users\shipingzhong>

# Import-Csv data.csv   #读取data.csv

# Where-Object {$_.age -gt 30}   #筛选出年龄大于30岁的用户

# ConvertTo-Html   #转换成html格式

# Out-File output.html  #输出成output.html文件


image.png

image.png

CMD的脚本语会扩展名是.bat文件

PowerShell的扩展名是.ps15文件

bat 文件不友好

image.png

powershell代码比较友好

image.png

image.png

PS C:\Users\shipingzhong> Get-Command            #获取powershell所有的命令


CommandType     Name                                               Version    Source

-----------     ----                                               -------    ------

Alias           Add-AppPackage                                     2.0.1.0    Appx

Alias           Add-AppPackageVolume                               2.0.1.0    Appx

Alias           Add-AppProvisionedPackage                          3.0        Dism


image.png

PS C:\Users\shipingzhong> Update-Help        #更新命令的帮助文档


image.png

PS C:\Users\shipingzhong> Get-Help Get-Command            #获取单个命令 Get-Command 的帮助文档

名称

    Get-Command


语法

    Get-Command [[-ArgumentList] <Object[]>]  [<CommonParameters>]


    Get-Command [[-Name] <string[]>] [[-ArgumentList] <Object[]>]  [<CommonParameters>]



别名

    gcm



备注

    Get-Help 在此计算机上找不到该 cmdlet 的帮助文件。它仅显示部分帮助。

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

        -- 若要联机查看此 cmdlet 的帮助主题,请键入: "Get-Help Get-Command -Online" 或

           转到 https://go.microsoft.com/fwlink/?LinkID=113309




PS C:\Users\shipingzhong>


与 linux 完全相同的命令

image.png

PS C:\Users\shipingzhong> pwd            #输出当前的工作目录


Path

----

C:\Users\shipingzhong



PS C:\Users\shipingzhong> Get-Alias pwd  #查看pwd是哪个命令的别名


CommandType     Name                                               Version    Source

-----------     ----                                               -------    ------

Alias           pwd -> Get-Location



PS C:\Users\shipingzhong>



image.png


PS C:\Users\shipingzhong> ls        #列出当前目录的文件和文件夹



    目录: C:\Users\shipingzhong



Mode                 LastWriteTime         Length Name

----                 -------------         ------ ----

d-----         2024/6/29     11:40                .cisco

d-----         2024/6/29     11:53                .config

d-----         2024/6/29     22:45                .vscode

d-----         2024/6/30      1:15                .WebIde90

d-r---         2024/6/29      9:43                3D Objects

d-r---         2024/6/29      9:43                Contacts

d-r---         2024/9/16     16:05                Desktop

d-r---         2024/9/18     21:06                Documents

d-r---         2024/9/16     15:22                Downloads

d-r---         2024/6/29      9:43                Favorites

d-----         2024/6/29     10:30                Intel

d-r---         2024/6/29      9:43                Links

d-r---         2024/6/29      9:43                Music

d-r---         2024/6/29     14:23                OneDrive

d-----         2024/7/17     20:07                OpenVPN

d-r---         2024/6/29     13:19                Pictures

d-----          2024/8/3     19:43                PycharmProjects

d-----         2024/7/14     21:42                sangfor

d-r---         2024/6/29      9:43                Saved Games

d-r---          2024/7/7     11:25                Searches

d-r---         2024/6/30     12:55                Videos

-a----         2024/9/18     21:06             32 data.csv

-a----         2024/6/29     20:35            475 my.js

-a----         2024/9/18     21:06            762 output.html



PS C:\Users\shipingzhong>


image.png

PS C:\Users\shipingzhong> clear            #清屏命令


image.png

PS C:\Users\shipingzhong> cat data.csv        #cat文件,查看data.csv文件的内容

Age

20

30

40

50

60

70

PS C:\Users\shipingzhong>


image.png

PS C:\Users\shipingzhong> mkdir 测试2            #新建文件夹  "测试2"


    

    目录: C:\Users\shipingzhong



Mode                 LastWriteTime         Length Name

----                 -------------         ------ ----

d-----         2024/9/18     21:28                测试2



PS C:\Users\shipingzhong>


image.png

PS C:\Users\shipingzhong> mv .\data.csv 测试2            #把 data.csv 移动到 "测试2"文件夹

PS C:\Users\shipingzhong>


image.png

PS C:\Users\shipingzhong> cp .\测试2\data.csv ./                #把 ".\测试2\data.csv" 复制到当前目录下

PS C:\Users\shipingzhong>


image.png

PS C:\Users\shipingzhong> rm .\data.csv            #删除文件

PS C:\Users\shipingzhong>


image.png

PS C:\Users\shipingzhong> ps | Export-csv test1.csv            #把所有进程输出到test1.csv 文件里面

PS C:\Users\shipingzhong>   ps | Export-Csv -Path test.csv      #这个命令里多出一个-path ,似乎不理想,界面一直在等待


image.png

PS C:\Users\shipingzhong> ps | ConvertTo-Html > test.html        #输出为 test.html文件

PS C:\Users\shipingzhong>


来自  https://www.bilibili.com/video/BV1Nx4y147n3/?spm_id_from=333.337.search-card.all.click&vd_source=346847773d1f74962a4daab9ddf7f228   有大用



PowerShell入门

01 | PowerShell编程基础

02| 对象与.NET

03 | Cmdlets与Pipeline

04 | 高级编程

05 | 模块创建



PowerShell编程基础

变量

运行时数据的存储

数据结构

●运行时数据的组织

控制结构

程序流控制


变量

●运行时数据的存储

-如:计算结果,字符串等

●PowerShell 是动态类型

●$<变量名> = <值>

-例子: $surname = "John'

$length = 32

变量名称不区分大小写

预定义变量

●$null  ---> 空值

●$true ---> 真值为真

●$false ---> 真值为假

●$_   ---> 当前处理的元素

image.png

创建   @(<元素>,<元素>,...)

索引   <数组>[<索引>]

运用赋值操作符,可将数组元素添加到对应的位置

因为 powershell 是动态类型,所以 powershell 数组可以储存不同类型的数据,如数字,字符串

powershell中数组的索引是从零开始

image.png


哈希表通过键值对来组织数据

我们不需要事先知道哈希表的大小

创建  ->   @{<键> = <值>;...}

索引  ->  <哈希表>[<键>]

括号里用赋值操作符给键值对赋值 ,, 用分号或者换行来分隔键值对

数据结构的索引也是用变量名后加方括号 ,, 但不同于数组,方括号里不添加下标,而是对应的键名

image.png

PS C:\Windows\system32> $var = 5

PS C:\Windows\system32> $var

5

image.png

PS C:\Windows\system32> $var.GetType()        #获取变量的类型信息


IsPublic IsSerial Name                                     BaseType

-------- -------- ----                                     --------

True     True     Int32                                    System.ValueType



PS C:\Windows\system32>

image.png

PS C:\Windows\system32> $var = "Hello world"        #将变量赋为字符串类型

PS C:\Windows\system32> $var.GetType()           #获取变量的类型信息


IsPublic IsSerial Name                                     BaseType

-------- -------- ----                                     --------

True     True     String                                   System.Object



PS C:\Windows\system32>

image.png

PS C:\Windows\system32> $uninitalized            # 未赋值,自动初始化为$null

PS C:\Windows\system32> $uninitalized -eq $null

True

PS C:\Windows\system32> $uninitalized -eq 0        #与0比较,结果为假

False

PS C:\Windows\system32>

image.png

PS C:\Windows\system32> $a = @('john',42,'jane')            #定义数组,里面的字符串可为单引号或双引号

PS C:\Windows\system32> $a[0]

john

PS C:\Windows\system32>

image.png

PS C:\Windows\system32> $a[0] = "jenny"     #给数组元素赋值

PS C:\Windows\system32> $a            #逐行输出数组的所有值,

jenny

42

jane

PS C:\Windows\system32>

image.png

image.png

image.png

PS C:\Windows\system32> $person = @{name="john";age=12}        #定义哈希表,每个元素以键值对的形式表示,每个元素以分号分隔

PS C:\Windows\system32> $person['name']  #以变量名后面加上方括号取一个元素的值

john

PS C:\Windows\system32> $person.age        #以变量名后面加上点来取一个元素的值

12

PS C:\Windows\system32> $person.age = 33        #给哈希表某一个元素赋值

PS C:\Windows\system32> $person.age

33

PS C:\Windows\system32>


控制结构-分支

●程序流的控制

-lf-Else分支

- Switch语句.

控制结构-lf-Else

, 或条件决定后面语句的进一步执行

If (<条件>)

{

<语句>

}

ElseIf (<条件>)

{

<语句>

}

Else

{

<语句>

}


控制结构-Switch

●值决定后面语句的进一 步执行

Switch (<表达式>)

{

<测试值> { <语句> ;break}

Default { <语句> }

}


使用  visual studio code 开发工具 安装 powershell 扩展

image.png


$_   美元符下划线,在 switch 语句中,指的是当前的测试的变量的值

$_   美元符下划线,在 循环或迭代语句中, 通过 $_ 的属性 可以获取当前的迭代数,当前的元素等 



$var = 7
if ($var -gt 25) {
   Write-Output "$var is great than 25" <# Action to perform if the condition is true #>
} else{
    Write-Output "$var is not great than 25"
}

$x = 0
switch ($x) {
    7 { Write-Output "Value is 7 " }
    42 { Write-Output "Value is 42" ;break;}
    {$_ -gt 25} {Write-Output "value is greater then 25"}
    default {Write-Output "Value is anything else"}
}


控制结构~循环

条件

语句

语句


控制结构循环

条件

语句

语句


控制结构-For循环

For (<开始值>; <循环条件>; <迭代步骤>) { <语句> }

-例子:For($i=0;$i-1t10;i++)

{

...

}


ForEach (<元素> in <集合>) { <语句> }

-例子: ForEach ($number in $NumbersArray )

{

 ...

}



控制结构-While循环

While (<循环条件>) { <语句> }

-例子: While ($something -eq $true)

{

...

}

Do

{ <语句> } While |Until (<循环条件>)

例子: Do

{

...

} While ($something -eq $true )

Do

{

...

} Until ($something -eq  $true)


示例

$var = 7
if ($var -gt 25) {
   Write-Output "$var is great than 25" <# Action to perform if the condition is true #>
} else{
    Write-Output "$var is not great than 25"
}

$x = 0
switch ($x) {
    7 { Write-Output "Value is 7 " }
    42 { Write-Output "Value is 42" ;break;}
    {$_ -gt 25} {Write-Output "value is greater then 25"}
    default {Write-Output "Value is anything else"}
}

for($i=1;$i -le 5;$i++){
    $i
}

$numbers = @("one","two","three","four","five")
foreach($number in $numbers){
    $number
}


$x = 0
while ($x -lt 3){
    $x++
    Write-Host "Hello world"
}


image.png

来自  https://www.bilibili.com/video/BV1yb411g7n7?p=1&vd_source=346847773d1f74962a4daab9ddf7f228   有大用

( 即 https://www.bilibili.com/video/BV1yb411g7n7/?spm_id_from=333.337.search-card.all.click&vd_source=346847773d1f74962a4daab9ddf7f228    )



image.png


章节概览

对象与.NET

类与对象

●PowerShell是面向对象的

.NET

访问.NET类

PowerShell中的类

●自定义类


powershell 是基于对象,而不是基于文本的,,,通过 pipeline 传递到下一个的是对象,而不是文本

image.png


对象通过 点 加上属性名来访问对象的属性,这与哈希表一样



什么是对象?

, 对象.属性

, 对象.方法()

对象.方法(参数1,参数2)


image.png


PS C:\Users\shipingzhong> Get-Location        #返回当前目录,,,   类似于 # cd 命令

# 但是  Get-Location  返回的是一个对象,,,Path 是它的一个属性,,这个命令显示为一个表格

#有些 cmdlet 的命令 的结果显示为一个列表


Path

----

C:\Users\shipingzhong



PS C:\Users\shipingzhong>


image.png



PS C:\Users\shipingzhong> $location = Get-Location

PS C:\Users\shipingzhong> $location.Path   #通过 点 加上属性来访问属性的值

C:\Users\shipingzhong

PS C:\Users\shipingzhong>

image.png


PS C:\Users\shipingzhong> $location | gm   # gm 是 GET-Member 的别名



   TypeName:System.Management.Automation.PathInfo


Name         MemberType Definition

----         ---------- ----------

Equals       Method     bool Equals(System.Object obj)

GetHashCode  Method     int GetHashCode()

GetType      Method     type GetType()

ToString     Method     string ToString()

Drive        Property   System.Management.Automation.PSDriveInfo Drive {get;}

Path         Property   string Path {get;}

Provider     Property   System.Management.Automation.ProviderInfo Provider {get;}

ProviderPath Property   string ProviderPath {get;}



PS C:\Users\shipingzhong>


System.Management.Automation.PathInfo  是 .net 框架中的一个类

image.png

PS C:\Users\shipingzhong> $location.Drive        #它的Drive 属性,,,它含用关于底层驱动器目录的信息,,,它作为一个表格来显示,说明这个信息是一个对象的属性


Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation

----           ---------     --------- --------      ----                                               ---------------

C                 301.81         98.19 FileSystem    C:\                                             Users\shipingzhong



PS C:\Users\shipingzhong>

PowerShell中使用.NET

●完全访问.NET框架类

New-Object 创建对象

- New-Object <类型名> <构造函数参数>



PowerShell中使用.NET

访问类通过[<类型名>]

-例如: [System.Version]

类型转换

-例如: [System.Version] "1.0.3.4"

●访问类的静态元素

-类方法枚举,

-例如: [System.Version]::New0

(Ssystem.ConsoleColor::Red


来自  https://learn.microsoft.com/de-de/dotnet/api/system.version?view=net-8.0   有大用



PowerShell的类

●PowerShellv5.0-自定义类

新关键字

- Class

- Enum

- Static

一...

New-Object


image.png


PS C:\Windows\system32> $version = New-Object System.Version      #创建对象

PS C:\Windows\system32> $version


Major  Minor  Build  Revision

-----  -----  -----  --------

0      0      -1     -1



PS C:\Windows\system32>

image.pngPS C:\Windows\system32> $version=  New-Object System.Version 3,6       #创建对象

PS C:\Windows\system32> $version


Major  Minor  Build  Revision

-----  -----  -----  --------

3      6      -1     -1



PS C:\Windows\system32>

image.png

   

PS C:\Windows\system32> [System.Version]::New()    #创建对象


Major  Minor  Build  Revision

-----  -----  -----  --------

0      0      -1     -1



PS C:\Windows\system32>

image.png

PS C:\Windows\system32> [System.Version]::New(3,6)           #另一种方法来创建对象


Major  Minor  Build  Revision

-----  -----  -----  --------

3      6      -1     -1



PS C:\Windows\system32>

image.png

PS C:\Windows\system32> $version = New-Object System.Version 3,6

PS C:\Windows\system32> $version.ToString()            #对象的ToString 方法

3.6

PS C:\Windows\system32>


image.png

PS C:\Windows\system32>  [Int] 1.7            #类型转换 左方括号 类名 右方括号  加上参数

2

PS C:\Windows\system32>

image.png

PS C:\Windows\system32> [System.Version]"2.0.1.3"            #字符串转换为 .net类 (System.Version类) 的对象


Major  Minor  Build  Revision

-----  -----  -----  --------

2      0      1      3



PS C:\Windows\system32>



PowerShell的类

●PowerShellv5.0 →自定义类

●新关键字

- Class

- Enum .

-Static

-...

●New-Object



class <类名>

{

    <hidden | static>

    [<类型名>]$<属性名>


    <hidden| static>

    <构造函数名>(<参数>,...)

    {...}


    <hidden| static>

    [<返回类型>]<方法名>(<参数>,...) 

    {...}


}



class MyVersion
{
    [ Int]$Major
    [ Int ] $Minor
    [Int ]$Build
    [Int ]$Rev
    MyVersion()
    {
        $this.Major, $this.Minor, $this.Build, $this.Rev = 0
    }
    MyVersion( $Major, $Minor, $Build, $Rev)
    {
        $this.Major = $Major
        $this.Minor = $Minor
        $this.Build = $Build
        $this.Rev = $Rev
    }
    [String]ToString()
    {
        return ($this.Major , $this.Minor, $this.Build, $this.Rev) -join "."
    }

    [System.Version]Convert()
    {
        return [System.Version]$this.ToString()
    }
}
$myVersionA = New-Object MyVersion
$myVersionB = New-Object MyVersion 1, 2, 3, 4
$myVersionA. Minor      #0
$myVersionB.ToString()    #1.2.3.4


 

PowerShell枚举


enum VersionType {
    SoftwareVersion = 1
    HardwareVersion = 2
}
[VersionType]::SoftwareVersion

为什么结果是   SoftwareVersion 而不是 1  见  /node-admin/21549

课程概览

PowerShell入门

01|PowerShell编程基础

02| 对象与.NET

●对象

●类

●访问 .NET类

03 | Cmdlets与Pipeline


来自 https://www.bilibili.com/video/BV1yb411g7n7/?p=2&spm_id_from=pageDriver&vd_source=346847773d1f74962a4daab9ddf7f228  有大用



image.png

image.png


章节概览

Cmdlets 与Pipeline

Cmdlets

PowerShell命令/函数

Pipeline

● 连接Cmdlets

重要的Cmdlets与操作符

● ForEach, Where, Select, -Replace, -Join

脚本

● Windows版本字符串的格式化输出



什么是Cmdlets?

●可执行命令/PowerShell中的函数

●[<动词>-<名词>] [-<参数> <值>]

- Get-Content -Path 'C:\Logs\Log-040191.bxt'

- Set-ADAccountPassword -ldentity 'John' -NewPassword


#Get-Verb   #获取所有可用的动词列表。

image.png



image.png


Begin 里面的代码初始化

End  最终执行一次


Process 代码块里面的所有指令都将对每一个通过pipeliine接收的的对象执行一次,,,通过变量 $_ (美元符下划线 ) 来访问当前处理的元素



ForEach-Object

● 迭代对象

● -Begin, -Process, -End

● ForEach, For, %

'You',Me'| ForEach-Object { "Say $_" }

=>  Say You

    Say Me 



#  ForEach, For, 百分号%    ,,这三个都是别名 ,,但是我见到的例子 只看到 百分号 % 别名

ForEach-Object  详解 见    /node-admin/21673



Where-Object

● 筛选对象

● Where, ?

'You', 'Me' | Where-Object { $_ -match 'u' }

=> You


#  Where, 问号 ?    ,,这两个都是别名 ,,但是我见到的例子 只看到  问号 ?  别名

#  $_ -match 'u'  它的结果为 真 True 或 假 False,  表示 $_ 包含 字符串 u ,,这是一个正则表达式的匹配吧

#  Where-Object  表示筛选出 $_ -match 'u'  为 True 的对象



Select-Object

● 选择对象/属性

● -First, -Last, -Skip, -SkipLast, -Property, -Unique,

-ExpandProperty

●  Select

Get -ComputerInfo | Select-Object - ExpandProperty OsName

=> Microsoft Windows 10 Enterprise


#Select  是 Select-Object 的别名

Select-Object  详解 见   /node-admin/21674   


-Replace

● 搜索或替换字符串中的文本

● 支持正则表达式

'i like tea' -replace 'tea','coffee'

=> ilike coffee

'i like tea' -replace '\s','_'    

=> i_ like_ _coffee 


#   '\s'  在正则表达式中,表示空格


-Join

连接字符串

支持插入分隔符

-join ('a','b','c')

=>abc

127','0','0','1' -join '.'

=> 127.0.0.1


-join ('a','b','c')  ,,,,因为-join 优先级比 逗号,高,所以 后面的 'a','b','c' 要用括号括起来 


param
(
    $ShowBuild
)

Process {
    $version = [Version] $_
    $os = switch ($version.Major, $version.Minor -join ".") {
        '10.0' { "Windows 10/Windows Server 2016" }
        '6.3' { "Windows 8.1/Windows Server 2012R2" }
        '6.2' { "Windows 8/Windows Server 2012" }
        '6.1' { "Windows 7/Windows Server 2008R2" }
        '6.0' { "Windows Vista/Windows Server 2008" }
        '5.2' { "Windows X Professional/Windows Server 2003R2" }
        default { "Windows XP/Windows Server 2003 or older" }

    }
    if ($ShowBuild) {
        $os + " Build " + $version.Build
    }
    else {
        $os
    }
}




PS C:\Users\shipingzhong\Desktop\pw> "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1   #没有就是 $nulll 相当于 -ShowBuild $false

Windons 10/Mindows Server 2016

Mindows 8.1/Mindows Server 2012R2

PS C:\Users\shipingzhong\Desktop\pw> "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1 -ShowBuild $false

Windows 10/Windows Server 2016

Windows 8.1/Windows Server 2012R2

PS C:\Users\shipingzhong\Desktop\pw> "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1 -ShowBuild $true 

Windows 10/Windows Server 2016 Build 0   

Windows 8.1/Windows Server 2012R2 Build 0

PS C:\Users\shipingzhong\Desktop\pw> "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1 -ShowBuild 1 

Windows 10/Windows Server 2016 Build 0   

Windows 8.1/Windows Server 2012R2 Build 0

PS C:\Users\shipingzhong\Desktop\pw> "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1 -ShowBuild 

C:\Users\shipingzhong\Desktop\pw\Format-WindowsVesion.ps1 : 缺少参数“ShowBuild”的某个参数。请指定一个类型为“System.Object”的参数,然后再试一次。

所在位置 行:1 字符: 51

+ "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1 -ShowBuild

+                                                   ~~~~~~~~~~

    + CategoryInfo          : InvalidArgument: (:) [Format-WindowsVesion.ps1],ParameterBindingException

    + FullyQualifiedErrorId : MissingArgument,Format-WindowsVesion.ps1

 

PS C:\Users\shipingzhong\Desktop\pw>


image.png


PS C:\Windows\system32> Get-WmiObject win32_operatingSystem



SystemDirectory : C:\Windows\system32

Organization    :

BuildNumber     : 19045

RegisteredUser  : shipingzhong

SerialNumber    : 00331-10000-00001-AA518

Version         : 10.0.19045


PS C:\Windows\system32>


image.png

PS C:\Windows\system32> Get-WmiObject win32_operatingSystem | Select-Object -expandproperty Version

10.0.19045

PS C:\Windows\system32>


image.png# Get-WmiObject win32_operatingSystem | Select-Object -expandproperty Version | .\Format-WindowsVesion.ps1


来自  https://learn.microsoft.com/en-us/windows/win32/sysinfo/operating-system-version 有大用


PowerShell 入门

02|对象与.NET

03|Cmdlets与Pipeline

Cmdlets

Pipeline

ForEach-Object, Where-Object, Select-Object

-Replace 与-Join

脚本编写

04高级编程

image.png

来自  https://www.bilibili.com/video/BV1yb411g7n7?p=3   有大用



image.png

章节概览

高级编程

高级函数

    定义与使用

结构与语法

元素与属性

    通用参数,风险缓解参数,参数验证

从脚本到 Cmdlet

    脚本的调整与扩展



什么是高级函数?

脚本/函数 →Cmdlet

- 参数验证

- 通用参数

- 风险缓解参数

- ...


什么是高级函数?

·    [CmdletBinding()]  属性     #要启用高级函数,就要指定 [CmdletBinding()]属性 ,,,,[CmdletBinding()] 是 PowerShell 中的一个属性,用于将函数提升为高级函数(Advanced Function),

.    Param Block

(

           ...

)


通用参数       #激活 [CmdletBinding()]  属性,下面的参数可以自动供用户使用

.  -Verbose -> Write-Verbose

.  -Debug -> Write-Debug

.  -ErrorAction

- Continue

- SilentlyContinue

- Inquire

- Stop

- ...



风险缓解参数

. -Whatlf与-Confirm   # Whatlf查看将要执行的操作,不实际执行,,,Confirm,确认是否真的执行

. [CmdletBinding(supportsShouldProcess)]   #当使用 风险缓解参数-Whatlf与-Confirm 时,不能仅使用  [CmdletBinding()],而应该使用 [CmdletBinding(supportsShouldProcess)]

. If($PSCmdlet.shouldProcess(<目标>,<操作>))

  # $PSCmdlet  是内置的变量(对象),,,,$PSCmdlet.shouldProcess 是内置变量(对象)的方法

  #在Whatif的情况下,永远返回假,不执行操作,仅仅是查看操作的输出

                                                                               #<目标>,<操作> 是两个字符串

                                                                                #在Confirm的情况下,会有一个让用户确认的交互,以确定程序是否继续执行


  . If($PSCmdlet.shouldProcess(<目标>,<操作>)) 

  {

        <关键语句>  

  }




参数配置   

# 用属性来装饰参数

. [Parameter()]属性            

. [<Typ>]期望的类型

. $<Name>参数名


参数一属性

. [Parameter(Mandatory =<$false $true>)]

- $false →可选的   #不指定值的时候,也是不强制(Mandatory)的,相当于$false,,,未指定Mandatory ,也相当于不强制

- $true →必需的



参数一属性

. [Parameter(Position =<Int>)]        # 位置参数,可以理解为 (参数名 值) 仅为参数名 或仅为值

   -从0开始

. 无需明确指定形参来分配传递的实参



参数一属性

. [Parameter(ValueFromPipeline = <$false $true>)]

- $false →不接受

- $true →接受

无需明确指定形参来通过pipeline分配传递的实参




参数验证

. [Validateset(<元素>,<元素>,...)]

. [ValidateLength(<最小值>,<最大值>)]

. [ValidateRange(<最小值>,<最大值>)]

. [ValidateScript({<表达式>})]

. [ValidatePattern(<正则表达式>)]



[CmdletBinding()]  #激活高级函数功能,也就是激活扩展功能
param
(
    #要使用扩展功能,用到管道的话,必须使用 ValueFromPipeline 来定义
    # Parameter help description
    [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
    [string]
    $VersionString,
 
    $ShowBuild
)

Process {
    Write-Verbose "Processing Version String $_"

    Write-Verbose "Convertingto System.Version Object"
    $version = [Version] $_

    Write-Verbose "Derivating actual OS from Object"

    $os = switch ($version.Major, $version.Minor -join ".") {
        '10.0' { "Windows 10/Windows Server 2016" }
        '6.3' { "Windows 8.1/Windows Server 2012R2" }
        '6.2' { "Windows 8/Windows Server 2012" }
        '6.1' { "Windows 7/Windows Server 2008R2" }
        '6.0' { "Windows Vista/Windows Server 2008" }
        '5.2' { "Windows X Professional/Windows Server 2003R2" }
        default { "Windows XP/Windows Server 2003 or older" }

    }
    if ($ShowBuild) {
        $os + " Build " + $version.Build
    }
    else {
        $os
    }
}

PS C:\Users\16666739\Desktop\pw> "10.0.0.0","6.3.0.0"  | .\format-windowsversion.ps1

Windows 10/Windows Server 2016

Windows 8.1/Windows Server 2012R2

PS C:\Users\16666739\Desktop\pw>


PS C:\Users\16666739\Desktop\pw> "10.0.0.0","6.3.0.0"  | .\format-windowsversion.ps1 -verbose

详细信息: Processing Version String 10.0.0.0

详细信息: Convertingto System.Version Object

详细信息: Derivating actual OS from Object

Windows 10/Windows Server 2016

详细信息: Processing Version String 6.3.0.0

详细信息: Convertingto System.Version Object

详细信息: Derivating actual OS from Object

Windows 8.1/Windows Server 2012R2

PS C:\Users\16666739\Desktop\pw>


PS C:\Users\16666739\Desktop\pw> "10.0.0.0","6.3.0.0"  | .\format-windowsversion.ps1 -verbose -Showbuild $true

详细信息: Processing Version String 10.0.0.0

详细信息: Convertingto System.Version Object

详细信息: Derivating actual OS from Object

Windows 10/Windows Server 2016 Build 0

详细信息: Processing Version String 6.3.0.0

详细信息: Convertingto System.Version Object

详细信息: Derivating actual OS from Object

Windows 8.1/Windows Server 2012R2 Build 0

PS C:\Users\16666739\Desktop\pw>




[CmdletBinding()]  #激活高级函数功能,也就是激活扩展功能
param
(
    #要使用扩展功能,用到管道的话,必须使用 ValueFromPipeline 来定义
    # Parameter help description
    [ValidatePattern('^(\d+\.){3}\d+$')]
    [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
    [string]
    $VersionString,
 
    $ShowBuild
)

Process {
    Write-Verbose "Processing Version String $_"

    Write-Verbose "Convertingto System.Version Object"
    $version = [Version] $_

    Write-Verbose "Derivating actual OS from Object"

    $os = switch ($version.Major, $version.Minor -join ".") {
        '10.0' { "Windows 10/Windows Server 2016" }
        '6.3' { "Windows 8.1/Windows Server 2012R2" }
        '6.2' { "Windows 8/Windows Server 2012" }
        '6.1' { "Windows 7/Windows Server 2008R2" }
        '6.0' { "Windows Vista/Windows Server 2008" }
        '5.2' { "Windows X Professional/Windows Server 2003R2" }
        default { "Windows XP/Windows Server 2003 or older" }

    }
    if ($ShowBuild) {
        $os + " Build " + $version.Build
    }
    else {
        $os
    }
}

PS C:\Users\16666739\Desktop\pw> "10.0","6.3..0"  | .\format-windowsversion.ps1 -verbose -Showbuild $true     

C:\Users\16666739\Desktop\pw\format-windowsversion.ps1 : 无法对参数“VersionString”执行参数验证。参数“10.0”

与模式“^(\d+\.){3}\d+$”不匹配。请提供一个与“^(\d+\.){3}\d+$”匹配的参数,然后重试此命令。

所在位置 行:1 字符: 20

+ ... .0","6.3..0"  | .\format-windowsversion.ps1 -verbose -Showbuild $true

+                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : InvalidData: (10.0:String) [format-windowsversion.ps1],ParameterBindingValidati

    onException

    + FullyQualifiedErrorId : ParameterArgumentValidationError,format-windowsversion.ps1

 

C:\Users\16666739\Desktop\pw\format-windowsversion.ps1 : 无法对参数“VersionString”执行参数验证。参数“6.3..0   

”与模式“^(\d+\.){3}\d+$”不匹配。请提供一个与“^(\d+\.){3}\d+$”匹配的参数,然后重试此命令。

所在位置 行:1 字符: 20

+ ... .0","6.3..0"  | .\format-windowsversion.ps1 -verbose -Showbuild $true

+                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : InvalidData: (6.3..0:String) [format-windowsversion.ps1],ParameterBindingValida 

    tionException

    + FullyQualifiedErrorId : ParameterArgumentValidationError,format-windowsversion.ps1

 

PS C:\Users\16666739\Desktop\pw> 




[CmdletBinding()]  #激活高级函数功能,也就是激活扩展功能
param
(
    #要使用扩展功能,用到管道的话,必须使用 ValueFromPipeline 来定义
    # Parameter help description
    [ValidatePattern('^(\d+\.){3}\d+$')]
    [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
    [string]
    $VersionString,
 
    [Switch]
    $ShowBuild
)

Process {
    Write-Verbose "Processing Version String $_"

    Write-Verbose "Convertingto System.Version Object"
    $version = [Version] $_

    Write-Verbose "Derivating actual OS from Object"

    $os = switch ($version.Major, $version.Minor -join ".") {
        '10.0' { "Windows 10/Windows Server 2016" }
        '6.3' { "Windows 8.1/Windows Server 2012R2" }
        '6.2' { "Windows 8/Windows Server 2012" }
        '6.1' { "Windows 7/Windows Server 2008R2" }
        '6.0' { "Windows Vista/Windows Server 2008" }
        '5.2' { "Windows X Professional/Windows Server 2003R2" }
        default { "Windows XP/Windows Server 2003 or older" }

    }
    if ($ShowBuild) {
        $os + " Build " + $version.Build
    }
    else {
        $os
    }
}

PS C:\Users\16666739\Desktop\pw> "10.0.0.0","6.3.0.0"  | .\format-windowsversion.ps1 -verbose -Showbuild    #我们只需要参数名 -Showbuild  ,不需要参数值 $true,,,,,,  我们代码中的 ,    [Switch]$ShowBuild 参数的值就是  $true,,,因为我们的 $ShowBuild 是 Switch类型(即开关类型)

详细信息: Processing Version String 10.0.0.0

详细信息: Convertingto System.Version Object

详细信息: Derivating actual OS from Object

Windows 10/Windows Server 2016 Build 0

详细信息: Processing Version String 6.3.0.0

详细信息: Convertingto System.Version Object

详细信息: Derivating actual OS from Object

Windows 8.1/Windows Server 2012R2 Build 0

PS C:\Users\16666739\Desktop\pw>



[CmdletBinding(SupportsShouldProcess)]  #激活高级函数功能,也就是激活扩展功能 ,,,有了,SupportsShouldProcess  才能支持 -Whatif 和 -Confirm 参数
param
(
    #要使用扩展功能,用到管道的话,必须使用 ValueFromPipeline 来定义
    # Parameter help description
    [ValidatePattern('^(\d+\.){3}\d+$')]
    [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
    [string]
    $VersionString,
 
    [Switch]
    $ShowBuild
)


Process {
    Write-Verbose "Processing Version String $_"

    if ($PSCmdlet.ShouldProcess($_, 'Convert')) {
        Write-Verbose "Convertingto System.Version Object"
        $version = [Version] $_
    }

    if ($PSCmdlet.ShouldProcess($_, 'Derivate OS')) {
        Write-Verbose "Derivating actual OS from Object"

        $os = switch ($version.Major, $version.Minor -join ".") {
            '10.0' { "Windows 10/Windows Server 2016" }
            '6.3' { "Windows 8.1/Windows Server 2012R2" }
            '6.2' { "Windows 8/Windows Server 2012" }
            '6.1' { "Windows 7/Windows Server 2008R2" }
            '6.0' { "Windows Vista/Windows Server 2008" }
            '5.2' { "Windows X Professional/Windows Server 2003R2" }
            default { "Windows XP/Windows Server 2003 or older" }

        }
        if ($ShowBuild) {
            $os + " Build " + $version.Build
        }
        else {
            $os
        }
    }
}


 

PS C:\Users\shipingzhong\Desktop\pw> "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1 -Whatif    #Whatif 只是查看要执行的哪些操作,并没有真正的执行

WhatIf: 正在目标“10.0.0.0”上执行操作“Convert”。

WhatIf: 正在目标“10.0.0.0”上执行操作“Derivate OS”。

WhatIf: 正在目标“6.3.0.0”上执行操作“Convert”。     

WhatIf: 正在目标“6.3.0.0”上执行操作“Derivate OS”。 

PS C:\Users\shipingzhong\Desktop\pw>


PS C:\Users\shipingzhong\Desktop\pw> "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1 -Confirm        #Confirm 确认是否执行


确认

是否确实要执行此操作?

正在目标“10.0.0.0”上执行操作“Convert”。

[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 暂停(S)  [?] 帮助 (默认值为“Y”): Y


确认

是否确实要执行此操作?

正在目标“10.0.0.0”上执行操作“Derivate OS”。

[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 暂停(S)  [?] 帮助 (默认值为“Y”): Y

Windows 10/Windows Server 2016


确认

是否确实要执行此操作?

正在目标“6.3.0.0”上执行操作“Convert”。

[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 暂停(S)  [?] 帮助 (默认值为“Y”): Y


确认

是否确实要执行此操作?

正在目标“6.3.0.0”上执行操作“Derivate OS”。

[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 暂停(S)  [?] 帮助 (默认值为“Y”): Y

Windows 8.1/Windows Server 2012R2

PS C:\Users\shipingzhong\Desktop\pw>

image.png

来自 https://www.bilibili.com/video/BV1yb411g7n7?p=4&vd_source=346847773d1f74962a4daab9ddf7f228    有大用


 


image.png

课程概览

PowerShell入门

01|PowerShell编程基础

02|对象与.NET

03|Cmdlets与Pipeline

04|高级编程

05|创建PowerShell模块


章节概览

PowerShell编程基础

模块的结构和使用

模块的创建和导入

模块清单


什么是PowerShll模块?

● 集合相关的PowerShell功能

- Cmdlets

- 变量

- 别名

●●●

image.png

模块vs 脚本

● 模块的优点

  -多个相关的任务/函数

  -提供组合功能

  -易于分发

  -重用

● 脚本和模块的结合



模块的结构

●文件夹<模块名>→文件<模块名>. psm1   #模块扩展名是 .psm1,,存在于同名文件夹中,(即文件夹名与模块文件名同名)

●定义和实现

 - Cmdlets

 - 函数

 - 变量

 - 别名

模块清单(可选)


模块清单

文件夹 <模块名>→文件<模块名>.psd1

● 包含模块信息的键值对

- 作者,说明,模块版本...

- PowerShell 版本,.NET 版本,依赖性...

-功能导出

● New-ModuleManifest             

#模块清单的扩展名为 .psd1   



导入模块

● Import-Module <名称/路径>    #导入模块

● $PSModulePath                       #这个目录下的模块不需要指定完整路径,只需要模块名称就行了

● Get-Module                             #获取加载到当前上下文当中的所有模块




C:\Users\my\Desktop\WindowsVersion\WindowsVersion.psm1  文件  #模块文件必须与它所有的文件夹名称相同

function Format-WindowsVersion {
    [CmdletBinding(SupportsShouldProcess)]  #激活高级函数功能,也就是激活扩展功能 ,,,有了,SupportsShouldProcess  才能支持 -Whatif 和 -Confirm 参数
    param
    (
        #要使用扩展功能,用到管道的话,必须使用 ValueFromPipeline 来定义
        # Parameter help description
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string]
        $VersionString,
     
        [Switch]
        $ShowBuild
    )
      
    Process {
        Write-Verbose "Processing Version String $_"
   
        if ($PSCmdlet.ShouldProcess($_, 'Convert')) {
            Write-Verbose "Convertingto System.Version Object"
            $version = [Version] $_
        }
   
        if ($PSCmdlet.ShouldProcess($_, 'Derivate OS')) {
            Write-Verbose "Derivating actual OS from Object"
   
            $os = switch ($version.Major, $version.Minor -join ".") {
                '10.0' { "Windows 10/Windows Server 2016" }
                '6.3' { "Windows 8.1/Windows Server 2012R2" }
                '6.2' { "Windows 8/Windows Server 2012" }
                '6.1' { "Windows 7/Windows Server 2008R2" }
                '6.0' { "Windows Vista/Windows Server 2008" }
                '5.2' { "Windows X Professional/Windows Server 2003R2" }
                default { "Windows XP/Windows Server 2003 or older" }
   
            }
            if ($ShowBuild) {
                $os + " Build " + $version.Build
            }
            else {
                $os
            }
        }
    }
}



PS C:\Users\16666739\Desktop\WindowsVersion> pwd


Path

----

C:\Users\16666739\Desktop\WindowsVersion



PS C:\Users\16666739\Desktop\WindowsVersion> dir



    目录: C:\Users\16666739\Desktop\WindowsVersion



Mode                 LastWriteTime         Length Name

----                 -------------         ------ ----

-a----         2024/10/3     14:04            120 test.ps1

-a----         2024/10/3     13:35           1621 WindowsVersion.psm1



PS C:\Users\16666739\Desktop\WindowsVersion> Import-Module .\WindowsVersion.psm1       #导入模块

PS C:\Users\16666739\Desktop\WindowsVersion> Get-Module


ModuleType Version    Name                                ExportedCommands

---------- -------    ----                                ----------------

Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}   

Manifest   3.0.0.0    Microsoft.PowerShell.Security       {ConvertFrom-SecureString, ConvertTo-SecureString, Get-Acl, Get-Au...

Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}

Script     0.2.0      PowerShellEditorServices.Commands   {Clear-Host, ConvertFrom-ScriptExtent, ConvertTo-ScriptExtent, Fin...

Script     2024.7.0   PowerShellProTools                  {ConvertTo-WinForm, Merge-Script, Show-WinFormDesigner, Expand-Obj...

Binary     0.0.1      PowerShellProTools.VSCode           {Add-VSCodeTextDocumentText, Clear-VSCodeDecoration, Get-Completio...

Script     2.4.0      PSReadLine                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PSReadLine...

Script     0.0        WindowsVersion                      Format-WindowsVersion   #看到 WindowsVersion 模块已经导入到当前的 powershell 上下文中,,, WindowsVersion 模块已经导出了 ormat-WindowsVersion CmdLet



PS C:\Users\16666739\Desktop\WindowsVersion>


PS C:\Users\16666739\Desktop\WindowsVersion> "10.0.0.0" | Format-WindowsVersion

Windows 10/Windows Server 2016

PS C:\Users\16666739\Desktop\WindowsVersion> 



function Format-WindowsVersion {
    [CmdletBinding(SupportsShouldProcess)]  #激活高级函数功能,也就是激活扩展功能 ,,,有了,SupportsShouldProcess  才能支持 -Whatif 和 -Confirm 参数
    param
    (
        #要使用扩展功能,用到管道的话,必须使用 ValueFromPipeline 来定义
        # Parameter help description
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string]
        $VersionString,
     
        [Switch]
        $ShowBuild
    )
      
    Process {
        Write-Verbose "Processing Version String $_"
   
        if ($PSCmdlet.ShouldProcess($_, 'Convert')) {
            Write-Verbose "Convertingto System.Version Object"
            $version = [Version] $_
        }
   
        if ($PSCmdlet.ShouldProcess($_, 'Derivate OS')) {
            Write-Verbose "Derivating actual OS from Object"
   
            $os = switch ($version.Major, $version.Minor -join ".") {
                '10.0' { "Windows 10/Windows Server 2016" }
                '6.3' { "Windows 8.1/Windows Server 2012R2" }
                '6.2' { "Windows 8/Windows Server 2012" }
                '6.1' { "Windows 7/Windows Server 2008R2" }
                '6.0' { "Windows Vista/Windows Server 2008" }
                '5.2' { "Windows X Professional/Windows Server 2003R2" }
                default { "Windows XP/Windows Server 2003 or older" }
   
            }
            if ($ShowBuild) {
                $os + " Build " + $version.Build
            }
            else {
                $os
            }
        }
    }
}

function Get-WindowsVersion {
    Get-WmiObject -Class Win32_OperatingSystem | Select-Object -ExpandProperty Version
}


因为模块已经加载到内存中了,,又由于我们在硬盘上修改了模块,所以必须强制 powershell 重新读取模块(强制导入)

PS C:\Users\16666739\Desktop\WindowsVersion> Import-Module .\WindowsVersion.psm1 -Force  #强制导入

PS C:\Users\16666739\Desktop\WindowsVersion> Get-Module


ModuleType Version    Name                                ExportedCommands

---------- -------    ----                                ----------------

Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}    

Manifest   3.0.0.0    Microsoft.PowerShell.Security       {ConvertFrom-SecureString, ConvertTo-SecureString, Get-Acl, Get-Au... 

Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}

Script     0.2.0      PowerShellEditorServices.Commands   {Clear-Host, ConvertFrom-ScriptExtent, ConvertTo-ScriptExtent, Fin... 

Script     2024.7.0   PowerShellProTools                  {ConvertTo-WinForm, Merge-Script, Show-WinFormDesigner, Expand-Obj...

Binary     0.0.1      PowerShellProTools.VSCode           {Add-VSCodeTextDocumentText, Clear-VSCodeDecoration, Get-Completio... 

Script     2.4.0      PSReadLine                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PSReadLine... 

Script     0.0        WindowsVersion                      {Format-WindowsVersion, Get-WindowsVersion}    #可以看到第二个函数 Get-WindowsVersion 也在导出的功能列表中,,,Get-WindowsVersion 同样是一个CmdLet



PS C:\Users\16666739\Desktop\WindowsVersion>


PS C:\Users\16666739\Desktop\WindowsVersion> Get-WindowsVersion | Format-WindowsVersion   #执行这两个自定义的comlet 通过管道把第一个 comlet  的输出 作为 第二个comlet的输入  #获取系统的版本字符串,然后格式化输出

Windows 10/Windows Server 2016

PS C:\Users\16666739\Desktop\WindowsVersion>


PS C:\Users\16666739\Desktop\WindowsVersion> Get-Help New-ModuleManifest -Online            #查看 New-ModuleManifest cmdlet  的帮助 ,Online 表示在浏览器中在线打开帮助文档

PS C:\Users\16666739\Desktop\WindowsVersion> 

PS C:\Users\shipingzhong\Desktop\WindowsVersion> New-ModuleManifest -author "shipinzhong"  -companyname "lixun" -description "windows version string module"


位于命令管道位置 1 的 cmdlet New-ModuleManifest

请为以下参数提供值:

Path: WindowsVersion.psd1            #没有 path 参数,自动进入交互式模式,输入 模块清单文件名称(或者路径???)  #模块清单文件名称以 .psd1 结尾,模块清单文件名称并且必须与模块文件名称相同

PS C:\Users\shipingzhong\Desktop\WindowsVersion> 

image.png


C:\Users\shipingzhong\Desktop\WindowsVersion\WindowsVersion.psd1  #不完整的版本

#
# 模块“WindowsVersion”的模块清单
#
# 生成者: shipinzhong
#
# 生成时间: 2024/10/3
#

@{

# 与此清单关联的脚本模块或二进制模块文件。
RootModule = '.\WindowsVersion.psm1'

# 此模块的版本号。
ModuleVersion = '1.0'

# 支持的 PSEditions
# CompatiblePSEditions = @()

# 用于唯一标识此模块的 ID
GUID = 'fa9afb23-aa2c-423b-b364-1dca4d6db23d'

# 此模块的作者
Author = 'shipinzhong'

# 此模块所属的公司或供应商
CompanyName = 'lixun'

# 此模块的版权声明
Copyright = '(c) 2024 shipinzhong。保留所有权利。'

# 此模块所提供功能的说明
Description = 'windows version string module'

# 此模块要求的 Windows PowerShell 引擎的最低版本
# PowerShellVersion = ''

# 此模块要求的 Windows PowerShell 主机的名称
# PowerShellHostName = ''

# 此模块要求的 Windows PowerShell 主机的最低版本
# PowerShellHostVersion = ''

# 此模块要求使用的最低 Microsoft .NET Framework 版本。此先决条件仅对 PowerShell Desktop 版本有效。
# DotNetFrameworkVersion = ''

# 此模块要求使用的最低公共语言运行时(CLR)版本。此先决条件仅对 PowerShell Desktop 版本有效。
# CLRVersion = ''

# 此模块要求的处理器体系结构(无、X86、Amd64)
# ProcessorArchitecture = ''

# 必须在导入此模块之前先导入全局环境中的模块
# RequiredModules = @()

# 导入此模块之前必须加载的程序集
# RequiredAssemblies = @()

# 导入此模块之前运行在调用方环境中的脚本文件(.ps1)。
# ScriptsToProcess = @()

# 导入此模块时要加载的类型文件(.ps1xml)
# TypesToProcess = @()

# 导入此模块时要加载的格式文件(.ps1xml)
# FormatsToProcess = @()

# 将作为 RootModule/ModuleToProcess 中所指定模块的嵌套模块导入的模块
# NestedModules = @()

# 要从此模块中导出的函数。为了获得最佳性能,请不要使用通配符,不要删除该条目。如果没有要导出的函数,请使用空数组。
FunctionsToExport = @()

# 要从此模块中导出的 cmdlet。为了获得最佳性能,请不要使用通配符,不要删除该条目。如果没有要导出的 cmdlet,请使用空数组。
CmdletsToExport = @()

# 要从此模块中导出的变量
VariablesToExport = '*'

# 要从此模块中导出的别名。为了获得最佳性能,请不要使用通配符,不要删除该条目。如果没有要导出的别名,请使用空数组。
AliasesToExport = @()

# 要从此模块导出的 DSC 资源
# DscResourcesToExport = @()

# 与此模块一起打包的所有模块的列表
# ModuleList = @()

# 与此模块一起打包的所有文件的列表
# FileList = @()

# 要传递到 RootModule/ModuleToProcess 中指定的模块的专用数据。这还可能包含 PSData 哈希表以及 PowerShell 使用的其他模块元数据。
PrivateData = @{

    PSData = @{

        # 应用于此模块的标记。这些标记有助于在联机库中执行模块发现。
        # Tags = @()

        # 指向此模块的许可证的 URL。
        # LicenseUri = ''

        # 指向此项目的主网站的 URL。
        # ProjectUri = ''

        # 指向表示此模块的图标的 URL。
        # IconUri = ''

        # 此模块的 ReleaseNotes
        # ReleaseNotes = ''

    } # PSData 哈希表末尾

} # PrivateData 哈希表末尾

# 此模块的 HelpInfo URI
# HelpInfoURI = ''

# 从此模块中导出的命令的默认前缀。可以使用 Import-Module -Prefix 覆盖默认前缀。
# DefaultCommandPrefix = ''

}



PS C:\Users\shipingzhong\Desktop\WindowsVersion> Import-Module .\WindowsVersion.psd1 -force  # 从模块清单导入模块,,,,,,-force 强制导入

PS C:\Users\shipingzhong\Desktop\WindowsVersion> get-Module  -name   WindowsVersion  #此时,看到 导出命令(ExportedCommands) 中的内容为空,,因为模块文件中

FunctionsToExport = @()   它为空        #  get-Module  -name   WindowsVersion  

ModuleType Version    Name                                ExportedCommands

---------- -------    ----                                ----------------

Script     1.0        WindowsVersion



PS C:\Users\shipingzhong\Desktop\WindowsVersion>

 

C:\Users\shipingzhong\Desktop\WindowsVersion\WindowsVersion.psd1  #最终版本

#
# 模块“WindowsVersion”的模块清单
#
# 生成者: shipinzhong
#
# 生成时间: 2024/10/3
#

@{

# 与此清单关联的脚本模块或二进制模块文件。
RootModule = '.\WindowsVersion.psm1'

# 此模块的版本号。
ModuleVersion = '1.0'

# 支持的 PSEditions
# CompatiblePSEditions = @()

# 用于唯一标识此模块的 ID
GUID = 'fa9afb23-aa2c-423b-b364-1dca4d6db23d'

# 此模块的作者
Author = 'shipinzhong'

# 此模块所属的公司或供应商
CompanyName = 'lixun'

# 此模块的版权声明
Copyright = '(c) 2024 shipinzhong。保留所有权利。'

# 此模块所提供功能的说明
Description = 'windows version string module'

# 此模块要求的 Windows PowerShell 引擎的最低版本
# PowerShellVersion = ''

# 此模块要求的 Windows PowerShell 主机的名称
# PowerShellHostName = ''

# 此模块要求的 Windows PowerShell 主机的最低版本
# PowerShellHostVersion = ''

# 此模块要求使用的最低 Microsoft .NET Framework 版本。此先决条件仅对 PowerShell Desktop 版本有效。
# DotNetFrameworkVersion = ''

# 此模块要求使用的最低公共语言运行时(CLR)版本。此先决条件仅对 PowerShell Desktop 版本有效。
# CLRVersion = ''

# 此模块要求的处理器体系结构(无、X86、Amd64)
# ProcessorArchitecture = ''

# 必须在导入此模块之前先导入全局环境中的模块
# RequiredModules = @()

# 导入此模块之前必须加载的程序集
# RequiredAssemblies = @()

# 导入此模块之前运行在调用方环境中的脚本文件(.ps1)。
# ScriptsToProcess = @()

# 导入此模块时要加载的类型文件(.ps1xml)
# TypesToProcess = @()

# 导入此模块时要加载的格式文件(.ps1xml)
# FormatsToProcess = @()

# 将作为 RootModule/ModuleToProcess 中所指定模块的嵌套模块导入的模块
# NestedModules = @()

# 要从此模块中导出的函数。为了获得最佳性能,请不要使用通配符,不要删除该条目。如果没有要导出的函数,请使用空数组。
FunctionsToExport = @('Format-WindowsVersion','Get-WindowsVersion')  # 两个函数(这里是两个CmdLet)写在这里

# 要从此模块中导出的 cmdlet。为了获得最佳性能,请不要使用通配符,不要删除该条目。如果没有要导出的 cmdlet,请使用空数组。
CmdletsToExport = @()

# 要从此模块中导出的变量
VariablesToExport = '*'

# 要从此模块中导出的别名。为了获得最佳性能,请不要使用通配符,不要删除该条目。如果没有要导出的别名,请使用空数组。
AliasesToExport = @()

# 要从此模块导出的 DSC 资源
# DscResourcesToExport = @()

# 与此模块一起打包的所有模块的列表
# ModuleList = @()

# 与此模块一起打包的所有文件的列表
# FileList = @()

# 要传递到 RootModule/ModuleToProcess 中指定的模块的专用数据。这还可能包含 PSData 哈希表以及 PowerShell 使用的其他模块元数据。
PrivateData = @{

    PSData = @{

        # 应用于此模块的标记。这些标记有助于在联机库中执行模块发现。
        # Tags = @()

        # 指向此模块的许可证的 URL。
        # LicenseUri = ''

        # 指向此项目的主网站的 URL。
        # ProjectUri = ''

        # 指向表示此模块的图标的 URL。
        # IconUri = ''

        # 此模块的 ReleaseNotes
        # ReleaseNotes = ''

    } # PSData 哈希表末尾

} # PrivateData 哈希表末尾

# 此模块的 HelpInfo URI
# HelpInfoURI = ''

# 从此模块中导出的命令的默认前缀。可以使用 Import-Module -Prefix 覆盖默认前缀。
# DefaultCommandPrefix = ''

}


PS C:\Users\shipingzhong\Desktop\WindowsVersion> Import-Module .\WindowsVersion.psd1 -force        # 从模块清单强制重新加载模块(导入模块)

PS C:\Users\shipingzhong\Desktop\WindowsVersion> get-Module  -name   WindowsVersion    #  看到了ExportCommand 中 不为空了 (导出了 CmdLet 有 Format-WindowsVersion, Get-WindowsVersion)


ModuleType Version    Name                                ExportedCommands

---------- -------    ----                                ----------------

Script     1.0        WindowsVersion                      {Format-WindowsVersion, Get-WindowsVersion}



PS C:\Users\shipingzhong\Desktop\WindowsVersion>


为了让我们做的这个模块在全局范围内可用,,我们可以将它整个模块文件夹 移动到环境变量 $PSModulePath  ($env:PSModulePath  )下列出的目录之一,,,或者也可以将这个模块文件夹所在的目录 增加到环境变量  $PSModulePath  中

image.png

PS C:\Windows\system32> $env:PSModulePath        #查看环境变量

C:\Users\shipingzhong\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules

PS C:\Windows\system32>


其中 C:\Windows\system32\WindowsPowerShell\v1.0\Modules 包含特定于windows的系统模块,,该目录不应该用于自己的用户模块,,,,,自己的用户模块只能通过用户文件夹中相应路径分发给特定用户,,,,,,,为了使模块可以被全局使用,,我们可以将 C:\Users\shipingzhong\Desktop\WindowsVersion 模块 复制到 C:\Program Files\WindowsPowerShell\Modules 目录(属于$PSModulePath的路径)下面


模块里有两个文件:模块文件和清单文件

image.png

复制模块文件到 到 C:\Program Files\WindowsPowerShell\Modules  下面


image.png


image.png


PS C:\Windows\system32> get-module


ModuleType Version    Name                                ExportedCommands

---------- -------    ----                                ----------------

Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}

Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PS...



PS C:\Windows\system32> Import-Module WindowsVersion  #发生报错,可以执行下面的一行命令,,详情见  /node-admin/21706  /node-admin/21676

Import-Module : 无法加载文件 C:\Program Files\WindowsPowerShell\Modules\WindowsVersion\WindowsVersion.psm1,因为在此系

统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。

所在位置 行:1 字符: 1

+ Import-Module WindowsVersion

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : SecurityError: (:) [Import-Module],PSSecurityException

    + FullyQualifiedErrorId : UnauthorizedAccess,Microsoft.PowerShell.Commands.ImportModuleCommand

PS C:\Windows\system32> Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy Unrestricted


执行策略更改

执行策略可帮助你防止执行不信任的脚本。更改执行策略可能会产生安全风险,如 https:/go.microsoft.com/fwlink/?LinkID=135170 中的

about_Execution_Policies 帮助主题所述。是否要更改执行策略?

[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 暂停(S)  [?] 帮助 (默认值为“N”): A

PS C:\Windows\system32>


#这是新复制到 C:\Program Files\WindowsPowerShell\Modules 的模块,所以要导入一下,,, 当然重启后,再打开powershell窗口,就无须再导入,,,,,,

PS C:\Windows\system32> Import-Module WindowsVersion    #直接通过指定名称来导入模块,,,不必使用  .\WindowsVersion.psd1  或  .\WindowsVersion.psm1    #此时系统当中的其它用户都可以访问该模块

PS C:\Windows\system32> Get-Module 


ModuleType Version    Name                                ExportedCommands

---------- -------    ----                                ----------------

Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}

Manifest   3.0.0.0    Microsoft.PowerShell.Security       {ConvertFrom-SecureString, ConvertTo-SecureString, Get-Acl, Get-AuthenticodeSignature...

Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}

Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PSReadLineKeyHandler, Set-PSR...

Script     1.0        WindowsVersion                      {Format-WindowsVersion, Get-WindowsVersion}



PS C:\Windows\system32>


课程概览

PowerShell入门

04|高级编程

05 |创建PowerShell模块

 ● 模块的结构和使用

 ● 模块的创建和导入

 ● 模块清单





来自  https://www.bilibili.com/video/BV1yb411g7n7?p=5  有大用




1.认识PowerShell

image.png

image.png

image.png

PS C:\Users\16666739> $psversiontable   #查看 powershell 版本


Name                           Value

----                           -----

PSVersion                      5.1.19041.2364

PSEdition                      Desktop

PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}

BuildVersion                   10.0.19041.2364

CLRVersion                     4.0.30319.42000

WSManStackVersion              3.0

PSRemotingProtocolVersion      2.3

SerializationVersion           1.1.0.1



PS C:\Users\16666739>

来自   https://www.bilibili.com/video/BV1Et4y1C7ZB?p=1&vd_source=dc680bf12084f74c551f474664c2b741   



2.PowerShell强大之处


image.png

PS C:\Users\16666739> 1GB  #1GB 换算成多少字节

1073741824

PS C:\Users\16666739> 1024*1024*1024    #算术运算

1073741824

PS C:\Users\16666739> (8*9*9)/2     #算术运算

324

PS C:\Users\16666739>

image.png

PS C:\Users\16666739> get-service                #得到服务   动词-名词 的形式


Status   Name               DisplayName

------   ----               -----------

Stopped  .Winhlpsvr         Windows Helper Service

Running  2345BrowserServcie 2345加速浏览器服务

Running  2345HaoZip         好压压缩服务

Running  2345Pic            看图服务

Running  2345SafeCenterSvc  2345SafeCenterSvc


# services.msc          # dos 中,以图形化的方式展示出来

image.png



来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?p=2&spm_id_from=pageDriver&vd_source=dc680bf12084f74c551f474664c2b741    


3.自定义PowerShell控制台


image.png


image.png


来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?p=3&spm_id_from=pageDriver&vd_source=dc680bf12084f74c551f474664c2b741



4.PowerShell快捷键


ALT+F7 清除命令的历史记录

PgUp PgDn   翻页的效果

Enter 执行当前命令

End 将光标移至当前命令的末尾

Del     从右开始删除输入的命令字符

Esc 清空当前命令行

F2 自动补充历史命令至指定字符

F4 删除命令行至光标右边指定字符处

F7 对话框显示命令行历史记录

F8 检索包含指定字符的命令行历史记录

F9 根据命令行的历史记录编号选择命令,历史记录编号可以通过F7查看

左/右  左箭头,右箭头  左右移动光标

上/下  上箭头,下箭头  切换命令行的历史记录

Home  光标移至命令行最左端

Backspace   从右删除命令行字符

Ctrl+C  取消正在执行的命令

Tab  自动补齐命令或者文件名



来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?p=4&vd_source=dc680bf12084f74c551f474664c2b741




5.PowerShell管道和重定向

image.png


PS C:\> ls

PS C:\> ls  | Format-Table mode,name


image.png

PS D:\> d:

PS D:\> ls | Format-Table name,mode > demo.txt        #一个大于号覆盖输出

PS D:\> type demo.txt


Name                 Mode

----                 ----

360Downloads         d-----

backup               d-----

BaiduNetdiskDownload d-----

ftp 客户端              d-----

HRAppStoreDownload   d-----

demo.txt             -a----



PS D:\> ls | Format-Table name,mode  >> demo.txt     #两个大于号,是附加输出



来自  https://www.bilibili.com/video/BV1Et4y1C7ZB/?p=5&spm_id_from=pageDriver&vd_source=346847773d1f74962a4daab9ddf7f228


6.PowerShell数学运算

image.png

PS D:\> ls | Format-Table name,mode >> demo.txt

PS D:\> 1+6

7

PS D:\> 1*6+5%2

7

PS D:\>


image.png

PS D:\> (1+7)/2

4

PS D:\> 1gb/1mb

1024

PS D:\> 1gb/1mb*188kb

197132288

PS D:\> 1024*18*1024

18874368

PS D:\> 1gb -gt 2mb

True

PS D:\> 0xabc        #十六进制转换为10进制

2748

PS D:\> 0xabcd        #十六进制转换为10进制

43981

PS D:\>


来自  https://www.bilibili.com/video/BV1Et4y1C7ZB/?p=6&spm_id_from=pageDriver&vd_source=346847773d1f74962a4daab9ddf7f228



7.PowerShell执行外部命令

Dos 程序打开

# netstat --ano    #查看端口信息

# ipconfig            #查看ip

# route print      #打印路由

# start \                #打开路径,也可以打开程序

# start notepad            #打开记事本程序

# notepad            #打开记事本程序



Powershell 程序打开

# netstat --ano    #查看端口信息

# ipconfig            #查看ip

# route print      #打印路由

# start \                #打开路径,也可以打开程序

# start notepad            #打开记事本程序

# notepad            #打开记事本程序

# &"notepad"        #打开notepad ,,,执行命令的话,用与符号&

# $env:path            #打印系统环境变量




来自 https://www.bilibili.com/video/BV1Et4y1C7ZB/?p=7&spm_id_from=pageDriver&vd_source=346847773d1f74962a4daab9ddf7f228  


8.PowerShell命令集

# Get-Command         #获取所有命令

所有的命令 就是 动词-名词         的形式   (动词  中短横 (杠) 名词)

# Get-help Get-Command    #查看  Get-Command  命令的帮助信息

# Get-Process        #获取所有进程信息

# Get-Aliase          #获取别名  

image.png  

# get-history        #获取历史命令的信息  

image.png

# get-date        #获取当前时间

来自  https://www.bilibili.com/video/BV1Et4y1C7ZB/?p=8&spm_id_from=pageDriver&vd_source=346847773d1f74962a4daab9ddf7f228



9.PowerShell别名使用

# get-childitem        #列出当前目录的文件和子目录

# get-alias                #获取所有的别名


image.png

image.png

# Get-Alias     ls            #        查询某一个别名 ls 对应的真实的命令 get-childitem

# Get-Alias  -name   ls            #      也是查询某一个别名  ls  对应的真实的命令 get-childitem

# Get-Alias  -name   dir          #查询某一个别名  dir  对应的真实的命令 get-childitem

    



#   Get-Alias -name fl            #  查询某一个别名 fl 对应的真实的命令( Format-List 格式化为列表 )

#    Get-Alias -name ft          #  查询某一个别名 fl 对应的真实的命令( Format-Table格式化为表格 )


image.png

 #  get-alias |  where {$_.definition.startswith("Remove")}            #查找出以 Remove 开头的别名

# 为什么它有这个属性 definition  ,  查看 $_ 的所有属性 ,见   /node-admin/21718

image.png

# get-alias |  where {$_.definition.startswith("Remove-Item")}        #查找出 Remove-Item 的所有别名


image.png

#  Get-Alias | Group-Object Definition | sort -Descending Count            #获取所有的别名,降序排列  详解 见 /node-admin/21717


Count Name                      Group

----- ----                      -----

    6 Remove-Item               {del, erase, rd, ri...}

    3 Get-ChildItem             {dir, gci, ls}

    3 Get-History               {ghy, h, history}

    3 Copy-Item                 {copy, cp, cpi}

    3 Invoke-WebRequest         {curl, iwr, wget}

    3 Set-Location              {cd, chdir, sl}

    3 Get-Content               {cat, gc, type}

.........



来自  https://www.bilibili.com/video/BV1Et4y1C7ZB/?p=9&spm_id_from=pageDriver&vd_source=346847773d1f74962a4daab9ddf7f228  


10.PowerShell自定义别名

#  Set-Alias -name pad -value notepad     # 设置别名  -name是别名 -value 是原命令名称  ,,,它时临时生效的

#  pad                                                         #此时可以直接打开记事本了

# del alias:pad                                             #删除别名 del                                                    


# Export-Alias demo.ps1                                  #导出别名

# type demo.ps1                                                #可以看到所有的别名被导出了       

如下图,为 demo.ps1 的内容                   

image.png


# Import-Alias demo.ps1                                      #导入别名,会报错,提示别名已存在

 Import-Alias -force demo.ps1                                     #强制导入别名,就不会报错了     


来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?p=10&vd_source=346847773d1f74962a4daab9ddf7f228    



11.PowerShell变量基础


image.png

PS D:\> $name="xiaoming"       #字符串赋值给变量

PS D:\> $name

xiaoming

PS D:\> $age=26         #数字赋值给变量

PS D:\> $age

26

PS D:\> ${"i am a" var()}="haha"  #特殊字符 "i am a" var() 赋值给变量,要用大括号括起来

PS D:\> ${"i am a" var()}

haha

PS D:\> $n=(7*6+8)/2        #表达式赋值给变量

PS D:\> $n

25

PS D:\> $n=ls        #命令的结果赋值给变量

PS D:\> $n



    目录: D:\



Mode                 LastWriteTime         Length Name

----                 -------------         ------ ----

d-----         2024/6/28     22:08                360Downloads

d-----         2024/10/6     14:54                aaa

d-----         2024/6/27     22:36                backup

d-----         2024/9/25     22:31                BaiduNetdiskDownload

d-----         2024/10/6     14:57                bbb

d-----          2024/8/3     18:28                ftp 客户端

d-----          2024/8/2     21:27                HRAppStoreDownload

-a----         2024/10/6     14:12            954 demo.txt



PS D:\>


image.png

PS D:\> $num1=$num2=35

PS D:\> $num1

35

PS D:\> $num2

35

PS D:\>


来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?p=11&vd_source=346847773d1f74962a4daab9ddf7f228


12.PowerShell变量操作

image.png

PS C:\Windows\system32> $num1=20

PS C:\Windows\system32> $num1=10

PS C:\Windows\system32> $num2=20

PS C:\Windows\system32> $temp=$num1

PS C:\Windows\system32> $num1=$num2

PS C:\Windows\system32> $num2=$temp

PS C:\Windows\system32> $num1

20

PS C:\Windows\system32> $num2

10

PS C:\Windows\system32>

image.png

PS C:\Windows\system32> $num1=10

PS C:\Windows\system32> $num2=20

PS C:\Windows\system32> $num1,$num2=$num2,$num1

PS C:\Windows\system32> $num1

20

PS C:\Windows\system32> $num2

10

PS C:\Windows\system32>


image.png

PS C:\Windows\system32> ls variable:        #当前正在使用的所有的字符串变量


Name                           Value

----                           -----

$                              varible:

?                              False

^                              ls

args                           {}

ConfirmPreference              High

ConsoleFileName

DebugPreference                SilentlyContinue

Error                          {找不到驱动器。名为“varible”的驱动器不存在。}

ErrorActionPreference          Continue

ErrorView                      NormalView

ExecutionContext               System.Management.Automation.EngineIntrinsics

false                          False

FormatEnumerationLimit         4

HOME                           C:\Users\shipingzhong

Host                           System.Management.Automation.Internal.Host.InternalHost

InformationPreference          SilentlyContinue

input                          System.Collections.ArrayList+ArrayListEnumeratorSimple

MaximumAliasCount              4096

MaximumDriveCount              4096

MaximumErrorCount              256

MaximumFunctionCount           4096

MaximumHistoryCount            4096

MaximumVariableCount           4096

MyInvocation                   System.Management.Automation.InvocationInfo

NestedPromptLevel              0

null

num1                           20

num2                           10

OutputEncoding                 System.Text.ASCIIEncoding

PID                            13292

PROFILE                        C:\Users\shipingzhong\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

ProgressPreference             Continue

PSBoundParameters              {}

PSCommandPath

PSCulture                      zh-CN

PSDefaultParameterValues       {}

PSEdition                      Desktop

PSEmailServer

PSHOME                         C:\Windows\System32\WindowsPowerShell\v1.0

PSScriptRoot

PSSessionApplicationName       wsman

PSSessionConfigurationName     http://schemas.microsoft.com/powershell/Microsoft.PowerShell

PSSessionOption                System.Management.Automation.Remoting.PSSessionOption

PSUICulture                    zh-CN

PSVersionTable                 {PSVersion, PSEdition, PSCompatibleVersions, BuildVersion...}

PWD                            C:\Windows\system32

ShellId                        Microsoft.PowerShell

StackTrace

temp                           10

true                           True

VerbosePreference              SilentlyContinue

WarningPreference              Continue

WhatIfPreference               False



PS C:\Windows\system32>

image.png

PS C:\Windows\system32> ls variable:num*            #查找出所有num开头的变量


Name                           Value

----                           -----

num1                           20

num2                           10



PS C:\Windows\system32> ls variable:num1           #查找出所有num1的变量


Name                           Value

----                           -----

num1                           20



PS C:\Windows\system32>

image.png

PS C:\Windows\system32> test-path variable:num1           #查找出num1的变量是否存在 

True

PS C:\Windows\system32> test-path variable:num0           #查找出num0的变量是否存在 

False

PS C:\Windows\system32>



PS C:\Windows\system32> del variable:num1                        #删除一个变量

PS C:\Windows\system32> test-path variable:num1                    #num1 变量已经不存在

False

PS C:\Windows\system32>

 clear-variable

 remove-variable

 get-variable

 set-variable

 new-variable

也可以创建只读变量(写保护,只允许读,不能重新修必赋值)


来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?p=12&vd_source=346847773d1f74962a4daab9ddf7f228


13.PowerShell自动化变量


自动化变量 是 powershell 自己创建并维护的

image.png

PS C:\Windows\system32> $home                #当前用户目录

C:\Users\shipingzhong

PS C:\Windows\system32>

image.png

PS C:\Windows\system32> $pid            #当前powershell 的进程id,是只读的,写保护的

13292

PS C:\Windows\system32>

image.png

PS C:\Windows\system32> $$                    #两个美元符,最后一次运行的命令,运行的令牌

$pid

PS C:\Windows\system32>

image.png

PS C:\Windows\system32> $?                   #美元符号问号,上一个命令的运行状态是真还是假

True

PS C:\Windows\system32>

image.png

PS C:\Windows\system32> $null                #空变量,

PS C:\Windows\system32>



来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?p=13&spm_id_from=pageDriver&vd_source=346847773d1f74962a4daab9ddf7f228


14.PowerShell环境变量

image.png

PS C:\Windows\system32> ls env:                # 查看环境变量

image.png

PS C:\Windows\system32> $env:path            #环境变量path的值

C:\Program Files (x86)\VMware\VMware Workstation\bin\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\EmEditor;C:\ProgramData\chocolatey\bin;D:\aaa;D:\bbb;D:\CCC

PS C:\Windows\system32> $env:windir           #环境变量windir的值

C:\Windows

PS C:\Windows\system32>

image.png

PS C:\Windows\system32> $env:OS          #环境变量OS的值

Windows_NT

PS C:\Windows\system32>

image.png

PS C:\Windows\system32> $env:name="xiaohua"                #自定义环境变量

PS C:\Windows\system32> ls env:                #可以发现自定义的环境变量 name

image.png


PS C:\Windows\system32> ls env:na*                #找到名为 na 开头的环境变量


Name                           Value

----                           -----

name                           xiaohua



PS C:\Windows\system32>

image.png

PS C:\Windows\system32> del env:name            #删除环境变量 name

PS C:\Windows\system32> $env:name                #看不到环境变量 name的值了

PS C:\Windows\system32>

image.png

PS C:\Windows\system32> ls env:name                #查找不到了环境变量 name 了

ls : 找不到路径“name”,因为该路径不存在。

所在位置 行:1 字符: 1

+ ls env:name

+ ~~~~~~~~~~~

    + CategoryInfo          : ObjectNotFound: (name:String) [Get-ChildItem], ItemNotFoundException

    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand


PS C:\Windows\system32>

image.png

PS C:\Windows\system32> $env:OS                   #查看环境变量

Windows_NT

PS C:\Windows\system32> $env:OS="Linux"            #修改环境变量,只是临时生效

PS C:\Windows\system32> $env:OS                   #查看环境变量,发现值变了

Linux

PS C:\Windows\system32>


用.net 的方法修改环境变量,可以永久生效 见  /node-admin/21716

image.png

PS C:\Users\Administrator> [environment]::SetEnvironmentVariable("PATH","D:\","User" )    #设置User的环境变量PATH

PS C:\Users\Administrator> [environment]::getEnvironmentVariable("PATH","User")              #获取User的环境变量PATH

D:\

PS C:\Users\Administrator>

下图也可以看到 PATH 变成D:\

image.png


用户变量仅对当前用户生效,,,系统变量对所有用户生效



来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?p=14&spm_id_from=pageDriver&vd_source=346847773d1f74962a4daab9ddf7f228


15.PowerShell脚本执行策略

image.png

demo.ps1

Get-Command


# C: \Users\Admini strator\Desktop\demo. ps1                #报错,在此系统上禁止运行脚本

image.png

# get-help set-executionpolicy            #查看 set-executionpolicy  帮助

image.png

# set-executionpolicy RemoteSigned              #设置策略

# get-executionpolicy                                      #返回策略

image.png

# C: \Users\Admini strator\Desktop\demo. ps1            已经能够正确运行,不报错了

image.png

来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?spm_id_from=333.788.videopod.episodes&vd_source=346847773d1f74962a4daab9ddf7f228&p=15


16.PowerShell与其他脚本程序的互相调用

image.png

image.png

PS C:\Users\shipingzhong> cd .\Desktop\

PS C:\Users\shipingzhong\Desktop> .\demo.bat   #执行 bat 文年

hello world

PS C:\Users\shipingzhong\Desktop>

PS C:\Users\shipingzhong\Desktop>


image.png

PS C:\Users\shipingzhong\Desktop> C:\Users\shipingzhong\Desktop\demo.bat    #执行 bat 文件

hello world

PS C:\Users\shipingzhong\Desktop>


image.png

demo.vbs    # vb vbscript 脚本

msgbox "hello world"


image.png

PS C:\Users\shipingzhong\Desktop> .\demo.vbs                #这样,就执行了这样一个 vbs 文件

PS C:\Users\shipingzhong\Desktop>


image.png

image.png

PS C:\Users\shipingzhong\Desktop> C:\Users\shipingzhong\Desktop\pw\test1.ps1            #执行 powshell 文件

Hello, ! You are 0 years old.

PS C:\Users\shipingzhong\Desktop>


image.png


demo.bat    # 下面的与符号  & 表示执行

@echo off

powershell "&' C:\Users\shipingzhong\Desktop\pw\test1.ps1'"

image.png

C:\Users\shipingzhong>C:\Users\shipingzhong\Desktop\demo.bat            #bat 里面 执行了 powershell 

Hello, ! You are 0 years old.


C:\Users\shipingzhong>

image.png

C:\Users\shipingzhong>cd Desktop


C:\Users\shipingzhong\Desktop>start demo.bat


C:\Users\shipingzhong\Desktop>

image.png

C:\Users\shipingzhong\Desktop>.\demo.bat            #这样可以执行 bat 文件

Hello, ! You are 0 years old.


C:\Users\shipingzhong\Desktop>demo.bat             #这样也可以执行 bat 文件

Hello, ! You are 0 years old.


C:\Users\shipingzhong\Desktop>


也可以在powershell 调用 python 脚本文件


来自 https://www.bilibili.com/video/BV1Et4y1C7ZB?spm_id_from=333.788.videopod.episodes&vd_source=346847773d1f74962a4daab9ddf7f228&p=16




17.PowerShell条件操作符

-eq 

-nq

-gt

-lt

-le 

-contains

-notcontains

image.png

PS C:\Users\16666739> 89 -eq 67

False

PS C:\Users\16666739> 89 -eq 89

True

PS C:\Users\16666739> 1gb -gt 1mb

True

PS C:\Users\16666739> 1gb -gt 1tb

False

PS C:\Users\16666739>


image.png

PS C:\Users\16666739>

PS C:\Users\16666739> (1,2,3) -contains 1

True

PS C:\Users\16666739> (1,2,3) -contains 2

True

PS C:\Users\16666739> (1,2,3) -contains 8

False

PS C:\Users\16666739> (1,2,3) -notcontains 8

True

PS C:\Users\16666739>


image.png

PS C:\Users\16666739> $a=1gb -gt 1mb

PS C:\Users\16666739> $a

True

PS C:\Users\16666739> -not $a            #求反

False

PS C:\Users\16666739>


-and

-or 

-not 

-xor         #异或

image.png

PS C:\Users\16666739> 1 -and 1

True

PS C:\Users\16666739> 1 -and 2

True

PS C:\Users\16666739>

image.png

PS C:\Users\16666739> $true -and $true

True

PS C:\Users\16666739> $true -and $false

False

PS C:\Users\16666739> $true -or $false

True

PS C:\Users\16666739> $false -or $false

False

PS C:\Users\16666739>


image.png

PS C:\Users\16666739> -not $true

False

PS C:\Users\16666739>


image.png

PS C:\Users\16666739> 1,5,8,0,9 -ne 0                #   1,5,8,0,9  这是一个数组,可以加上括号 即 (1,5,8,0,9) ,,,,, 筛选出  不等于 0  的值

1

5

8

9

PS C:\Users\16666739>

image.png

PS C:\Users\16666739> 1,5,8,0,9 -eq 0              #筛选出  等于 0  的值

0

PS C:\Users\16666739>

image.png

PS C:\Users\16666739> 1,5,8,0,9 -contains 0            #判断是否包含 0 

True

PS C:\Users\16666739> 1,5,8,0,9 -notcontains 0          #判断是否不包含 0 

False



来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?spm_id_from=333.788.videopod.episodes&vd_source=346847773d1f74962a4daab9ddf7f228&p=17


18.PowerShell条件判断【if语句】

PS C:\Users\16666739>

image.png

PS C:\Users\16666739> $num=100

PS C:\Users\16666739> if($num -gt 90) {"1"}

1

PS C:\Users\16666739> if($num -gt 100) {"1"}

PS C:\Users\16666739> if($num -gt 100) {"1"} else{"-1"}

-1

PS C:\Users\16666739> if($num -gt 100) {"1"} elseif ($num -eq 100){"0"} else{"-1"}

0

PS C:\Users\16666739>


来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?spm_id_from=333.788.player.switch&vd_source=346847773d1f74962a4daab9ddf7f228&p=18



19.PowerShell条件判断【switch语句】

$number=56
if($number -gt 50)
{
  "此数值大于50"
}
elseif ($number -eq 50)
{
    "此数值等于50"
}
else
{
    "此数值小于50"
}



$number=56
if($number -gt 50 -and $number -lt 60)
{
  "此数值大于50小于60"
}
elseif ($number -eq 50)
{
    "此数值等于50"
}
else
{
    "此数值小于50"
}



$number=56
switch ($number) {
    {$_ -lt 50} { "此数值小于50" }
    {$_ -eq 50} { "此数值等于50" }
    {$_ -gt 50} { "此数值大于50" }
}


$number=56
switch ($number) {
    {$_ -lt 50} { "此数值小于50" }
    50 { "此数值等于50" }   #等于时可以这样子写
    {$_ -gt 50} { "此数值大于50" }
}



$number=49
switch ($number) {
    {($_ -lt 50) -and ($_ -gt 40)} { "此数值小于50且大于40" }
    50 { "此数值等于50" }   #等于时可以这样子写
    {$_ -gt 50} { "此数值大于50" }
}



来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?spm_id_from=333.788.videopod.episodes&vd_source=346847773d1f74962a4daab9ddf7f228&p=19


20.PowerShell循环结构【foreach语句】

# $arr=1,2,3,4,5,6,7,8,9,10 定义数组
$arr=1..10 #也是定义数组
$arr


# $arr=1,2,3,4,5,6,7,8,9,10 定义数组
$arr=1..10 #也是定义数组
foreach($n in $arr)
{
    $n
}


# $arr=1,2,3,4,5,6,7,8,9,10 定义数组
$arr=1..10 #也是定义数组
foreach($n in $arr)
{
    $n*$n
}


# $arr=1,2,3,4,5,6,7,8,9,10 定义数组
$arr=1..10 #也是定义数组
foreach($n in $arr)
{
    if($n -gt 5){
        $n
    }
}


foreach($file in dir C:\xampputf8\htdocs\shipingzhong.cn\public_html\fy\common)
{
    if($file.length -gt 1kb){  #大于1kb的文件打印出来
        $file.name
    }
}


$path_value=dir C:\xampputf8\htdocs\shipingzhong.cn\public_html\fy\common
foreach($file in $path_value)
{
    if($file.length -gt 1kb){
        $file.name
    }
}


来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?spm_id_from=333.788.player.switch&vd_source=346847773d1f74962a4daab9ddf7f228&p=20



21.PowerShell循环结构【while语句】

$num=15
while ($num -gt 10) {
  $num
  $num=$num-1
}


do  while 至少运行一次

$num=15
do{
  $num
  $num=$num-1
}
while ($num -gt 10)



来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?p=21&vd_source=dc680bf12084f74c551f474664c2b741



22.break和continue关键字使用


$num=1
while ($num -lt 6)
{
    if($num -eq 4)
    {
      break;
    }
    else{
      $num
      $num++
    }
}


$num=1
while ($num -lt 6)
{
    if($num -eq 4)
    {
        $num++
        continue;
    }
    else{
      $num
      $num++
    }
}



来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?vd_source=dc680bf12084f74c551f474664c2b741&spm_id_from=333.788.player.switch&p=22



23.PowerShell循环结构【for语句】

$sum=0
for ($i = 1; $i -le 100; $i++) {
    $sum=$sum+1
    #$sum
}
$sum



https://www.bilibili.com/video/BV1Et4y1C7ZB?vd_source=dc680bf12084f74c551f474664c2b741&spm_id_from=333.788.player.switch&p=23



24.PowerShell循环结构【switch循环】

switch 这里是一个循环

$num=1..10
switch ($num) {
    Default {"number=$_"}
}

image.png


$num=1..10
switch ($num)
{
    {($_ % 2 ) -eq 0 }{"$_ 是一个偶数"}
    {($_ % 2 ) -ne 0 }{"$_ 是一个奇数"}
}


$num=1..10
switch ($num)
{
    {( $_ % 2 ) -eq 0 } { " $_ 是一个偶数" }
    {( $_ % 2 ) -ne 0 } { " $_ 是一个奇数" }
}

image.png

来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?vd_source=dc680bf12084f74c551f474664c2b741&spm_id_from=333.788.player.switch&p=24



25.PowerShell数组的创建

数组示例一:

$arr=1,2,3,4
$arr


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"
1
2
3

4


[Done] exited with code=0 in 0.262 seconds




$arr=1..5
$arr


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"
!!!

[Done] exited with code=0 in 0.162 seconds



$arr=1..5
$arr
$arr -is [array]   #判断是否是一个数组


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\tempCodeRunnerFile.ps1"
1
2
3
4
5
True

[Done] exited with code=0 in 0.223 seconds



$arr=1,"hello world"   #数组可以包含不同的类型     
$arr
$arr -is [array]   #判断是否是一个数组


Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\tempCodeRunnerFile.ps1"
1
2
3
4
5
True

[Done] exited with code=0 in 0.223 seconds


$arr=@()   #空数组
$arr
$arr -is [array]   #判断是否是一个数组


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"
True

[Done] exited with code=0 in 0.186 seconds


$arr=,1   #只一个元素的数组
$arr
$arr -is [array]   #判断是否是一个数组


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"
1
True

[Done] exited with code=0 in 0.274 seconds


$arr=,"string"   #只有一个元素的数组
$arr
$arr -is [array]   #判断是否是一个数组


Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"
string
True

[Done] exited with code=0 in 0.185 seconds


# 为什么 ipconfig 是一个数组?它并不是cmdlet的一个命令,它会将每一行当作一个元素组织起来,组成一个数组,赋给变量$arr

$arr=ipconfig  #命令的结果作为一个数组
$arr
$arr -is [array]   #判断是否是一个数组

image.png

来自 https://www.bilibili.com/video/BV1Et4y1C7ZB?vd_source=dc680bf12084f74c551f474664c2b741&spm_id_from=333.788.player.switch&p=25



26.PowerShell访问数组

下图这几种各种不同的执行

image.png


$arr=1,"hello world",(get-date)
$arr    #获取数组中的无素

image.png


$arr=1,"hello world",(get-date)
$arr[0]        #获取数组中的一个无素

image.png


$arr=1,"hello world",(get-date)
$arr[0,1]  #获取数组中的多个无素

image.png



$arr=1,"hello world",(get-date)
$arr[-1]            #获取最后一个

image.png



$arr=1,"hello world",(get-date)
$arr[0..1]            #获取从第0个到第1个

image.png


$arr=1,"hello world",(get-date)
$arr[0..2]     #获取从第0个到第2个

image.png


$arr=1,"hello world",(get-date)
$arr[0..2].count            #获取数组大小

image.png



$arr=1,"hello world",(get-date)
$arr[($arr.count)..0]            #倒序输出数组

image.png




$arr=1,"hello world",(get-date)
$arr+="haha"        #数组添加元素
$arr

image.png



$arr=1,"hello world",(get-date)
$arr+="haha"
$arr.count

image.png


数组 也有 add remove 方法 来添加删除元素


https://www.bilibili.com/video/BV1Et4y1C7ZB?vd_source=dc680bf12084f74c551f474664c2b741&spm_id_from=333.788.videopod.episodes&p=26  

27.PowerShell自定义函数及调用


无参的函数  可以不写括号

function myping {
    ping www.baidu.com
}

myping

image.png



有参的函数

function myping ($site){
    ping $site
}


image.png


两个参数的函数

function myping ($name,$age){
    $content = "I am $name,and I am $age years old"
    Write-host $content
}

myping "xiaoming" 25

image.png



来自   https://www.bilibili.com/video/BV1Et4y1C7ZB?vd_source=dc680bf12084f74c551f474664c2b741&spm_id_from=333.788.player.switch&p=27


28.PowerShell函数返回值

为什么我这里没有输出$sum的值 ,但是视频中有输出$sum的值  

function add($num1,$num2)
{
  $sum=$num1+$num2
  return $sum
}

# $sum=add 3 4        #如果这里赋了值这里不会打印出任何值

add 3 4        #如果这里没有赋值,,所以打印出了 7


 

function add($num1,$num2)
{
  $sum=$num1+$num2
  $sum.getType()  #打印出数据的类型
  return $sum
}

add 3 4


function add($num1,$num2)
{
  $sum=$num1+$num2
  $sum.getType()  #打印出数据的类型
  $sum.getType().fullname  #打印出数据的类型的名称
  return $sum
}

add 3 4


function add($num1,$num2)
{
  $sum=$num1+$num2
  $sum.getType()  #打印出数据的类型 就是 double
  $sum.getType().fullname  #打印出数据的类型的名称System.Double
  return $sum
}

add 3.1 4



function add($num1,$num2)
{
  return $num1,$num2
}

add 3.1 4   #返回了多个值,,返回多个值的本质是返回一个数组


function add($num1,$num2,$num3)
{
    $value=$num1+$num2+$num3
    $value.GetType()  #返回的是一个数组
    return $value
}
add 3.1 4 6.8


function add($num1,$num2,$num3)
{
    $value=$num1+$num2+$num3
    $value.GetType()  #返回的类型是数组
    $value.GetType().Fullname  #返回的类型的名称是数组
    return $value
}

add 3.1 4 6.8



function add($num1,$num2,$num3)
{
    $value=$num1+$num2+$num3
    $value.GetType()  #返回的类型是数组
    $value.GetType().Fullname  #返回的类型的名称是数组
    return $value[-1]  #返回的是数组当中的最后一个值
}

add 3.1 4 6.8



function add($num1,$num2,$num3)
{
    $value=$num1+$num2+$num3
    $value.GetType()  #返回的类型是数组
    $value.GetType().Fullname  #返回的类型的名称是数组
    return $value[0..1]  #返回的是数组当中的第0个到第1个
}

add 3.1 4 6.8


function add($num1,$num2,$num3)
{
    $value=$num1+$num2+$num3
    $value.GetType()  #返回的类型是数组
    $value.GetType().Fullname  #返回的类型的名称是数组
    return $value[0..-1]  #返回的是数组当中的第0个到最后一个
}

add 3.1 4 6.8






来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?vd_source=dc680bf12084f74c551f474664c2b741&spm_id_from=333.788.videopod.episodes&p=28


29.PowerShell定义文本

"hello world $(get-date)"  # $(get-date) 是命令运行的结果字符串,此时要用双引号,如果用单引号,$(get-date)就是字符串


"hello world $(5*7)"  #表达式也可以


'my name is "xiaoming"'  #双引号呈现出来


"my name is `"xiaoming`""  #反引号来转义双引号    用反引号转义,不是用反斜杠来转义


`n  换行符

`r  回车符

`t  制表符

`b 退格符


"你好`n朋友"    #换行符示例






来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?vd_source=dc680bf12084f74c551f474664c2b741&spm_id_from=333.788.player.switch&p=29




30.PowerShell实现用户交互

$input  =  read-host "请输入您的姓名"    #读取用户输入
"您好,您输入的姓名是: $input"


来自 https://www.bilibili.com/video/BV1Et4y1C7ZB?vd_source=dc680bf12084f74c551f474664c2b741&spm_id_from=333.788.player.switch&p=30


31.PowerShell格式化字符串

$name="xiaoming"
$age=25
$body="strong"
"My name is $name,i am $age years old,and my body is $body"   #插值



$name="xiaoming"
$age=25
$body="strong"
"My name is {0},i am {1} years old,and my body is {2}" -f $name,$age,$body



$name="xiaoming"
$age=25
$body="strong"
"My name is {0},i am {1} years old,and my body is {2}" -f $name,$age,$body   # 用 -f  进行格式化 前面用 {0} {1} 等表示



$name="xiaoming"
$age=25
$body="strong"
"My name is {0},i am {1} years old,and my body is {2},{3}" -f $name,$age,$body,(3*6)   # 用 -f  进行格式化 前面用 {0} {1} 等表示 这里用括号括起来 表达式 (3*6)



来自   https://www.bilibili.com/video/BV1Et4y1C7ZB?vd_source=dc680bf12084f74c551f474664c2b741&spm_id_from=333.788.videopod.episodes&p=31


32.String对象方法


$str="C:\window\system32\demo.txt"
$str.split("\")
$str.split("\").getType()  #数组类型


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"

C:
window
system32
demo.txt

IsPublic IsSerial Name                                     BaseType                                                    
-------- -------- ----                                     --------                                                    
True     True     String[]                                 System.Array                                                



[Done] exited with code=0 in 0.23 seconds


$str="C:\window\system32\demo.txt"
$str.split(".")
$str.split("\").getType()  #数组类型


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"
C:\window\system32\demo
txt

IsPublic IsSerial Name                                     BaseType                                                    
-------- -------- ----                                     --------                                                    
True     True     String[]                                 System.Array                                                



[Done] exited with code=0 in 0.213 seconds


$str="C:\window\system32\demo.txt"
$str.split(".")[-1]


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\tempCodeRunnerFile.ps1"
txt

[Done] exited with code=0 in 0.204 seconds



$str="C:\window\system32\demo.txt"
$str.endswith("txt")   #判断是否以 txt 结尾


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"
True

[Done] exited with code=0 in 0.2 seconds



$str="C:\window\system32\demo.txt"
$str.endswith("lo")   #判断是否以 lo 结尾


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"
False

[Done] exited with code=0 in 0.179 seconds



$str="C:\window\system32\demo.txt"
$str.contains("txt")   #判断是否包含 txt 字符


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"

True

[Done] exited with code=0 in 0.191 seconds




$str="C:\window\system32\demo.txt"
$str.contains("window")   #判断是否包含 window 字符


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"
True

[Done] exited with code=0 in 0.184 seconds



$str="C:\window\system32\demo.txt"
$str.Compareto("window")   #判断是否包含 window 字符


$str="C:\window\system32\demo.txt"
$str.Compareto("window")   #与 window 进行比较,不相同 就是 -1


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"
-1

[Done] exited with code=0 in 0.19 seconds



$str="C:\window\system32\demo.txt"
$str.Compareto("C:\window\system32\demo.txt")   #与 C:\window\system32\demo.txt 进行比较  相同的话,结果为 0


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"
0

[Done] exited with code=0 in 0.191 seconds


$str="C:\window\system32\demo.txt"
$str.indexof("w")  #找出 w 的下标,位置 ,索引


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\tempCodeRunnerFile.ps1"
3

[Done] exited with code=0 in 0.209 seconds



$str="C:\window\system32\demo.txt"
$str.insert(3,"hahaha")  #在3的位置处(可以理解为在3的位置的前面)插入 hahaha  


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"
C:\hahahawindow\system32\demo.txt

[Done] exited with code=0 in 0.201 seconds



$str="C:\window\system32\demo.txt"
$str.replace("C","D")  #把 C 替换成 D


[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"
D:\window\system32\demo.txt

[Done] exited with code=0 in 0.165 seconds


可以使用 remove 进行删除 ,,,startswith 以什么什么开头



来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?vd_source=dc680bf12084f74c551f474664c2b741&spm_id_from=333.788.player.switch&p=32



33.PowerShell操作注册表

image.png


与操作文件目录一样操作注册表

image.png

PS C:\Users\shipingzhong> cd Hkcu:   #进入到注册表中的 HKEY_CURRENT_USER (HKCU)

PS HKCU:\>

image.png

PS HKCU:\> dir

image.png

PS HKCU:\> cd Console

PS HKCU:\Console> ls



    Hive: HKEY_CURRENT_USER\Console



Name                           Property

----                           --------

%SystemRoot%_System32_WindowsP ColorTable05     : 5645313

owerShell_v1.0_powershell.exe  ColorTable06     : 15789550

                               FaceName         : Lucida Console

                               FontFamily       : 54

                               FontWeight       : 400

                               PopupColors      : 243

                               QuickEdit        : 1

                               ScreenBufferSize : 196608120

                               ScreenColors     : 86

                               WindowSize       : 3276920

%SystemRoot%_SysWOW64_WindowsP ColorTable05     : 5645313

owerShell_v1.0_powershell.exe  ColorTable06     : 15789550

                               FaceName         : Lucida Console

                               FontFamily       : 54

                               FontWeight       : 400

                               PopupColors      : 243

                               QuickEdit        : 1

                               ScreenBufferSize : 196608120

                               ScreenColors     : 86

                               WindowSize       : 3276920



PS HKCU:\Console>

image.png

PS HKCU:\Console> cd ..

PS HKCU:\> exit


C:\Users\shipingzhong>

image.png

C:\Users\shipingzhong>powershell

Windows PowerShell

版权所有 (C) Microsoft Corporation。保留所有权利。


尝试新的跨平台 PowerShell https://aka.ms/pscore6


PS C:\Users\shipingzhong>

PS C:\Users\shipingzhong> cd HKLM:

PS HKLM:\> ls                #没有权限会报错

ls : 不允许所请求的注册表访问权。

所在位置 行:1 字符: 1

+ ls

+ ~~

    + CategoryInfo          : PermissionDenied: (HKEY_LOCAL_MACHINE\BCD00000000:String) [Get-ChildItem], SecurityExcep

   tion

    + FullyQualifiedErrorId : System.Security.SecurityException,Microsoft.PowerShell.Commands.GetChildItemCommand




    Hive: HKEY_LOCAL_MACHINE



Name                           Property

----                           --------

HARDWARE

SAM

ls : 不允许所请求的注册表访问权。

所在位置 行:1 字符: 1

+ ls

+ ~~

    + CategoryInfo          : PermissionDenied: (HKEY_LOCAL_MACHINE\SECURITY:String) [Get-ChildItem], SecurityExceptio

   n

    + FullyQualifiedErrorId : System.Security.SecurityException,Microsoft.PowerShell.Commands.GetChildItemCommand


SOFTWARE

SYSTEM



PS HKLM:\>


Get-ItemProperty  Set-ItemProperty  Remove-ItemProperty  Remove-ItemProperty   New-ItemProperty  md New-item


来自  https://www.bilibili.com/video/BV1Et4y1C7ZB?spm_id_from=333.788.videopod.episodes&vd_source=346847773d1f74962a4daab9ddf7f228&p=33






 https://www.bilibili.com/video/BV1Et4y1C7ZB/?spm_id_from=333.337.search-card.all.click&vd_source=346847773d1f74962a4daab9ddf7f228   有大用




https://search.bilibili.com/all?vt=68655503&keyword=powershell&search_source=1  

https://space.bilibili.com/297378187  

https://www.bilibili.com/video/BV1K54y1k77R/?spm_id_from=333.337.search-card.all.click 

https://www.bilibili.com/video/BV1wH4y1v7jw?p=20&vd_source=346847773d1f74962a4daab9ddf7f228  

https://www.bilibili.com/video/BV1u4411G7Th/?spm_id_from=333.788.player.player_end_recommend_autoplay&vd_source=346847773d1f74962a4daab9ddf7f228 




普通分类: