Windows Powershell基础篇

一、概要

PowerShell 是一种命令行外壳程序和脚本环境,它建立在.NET核心上。目前,win10和Windows Server 2012上已WMF已集成PowerShell 5.0;Windows PowerShell 是基于对象的,而不是基于文本的。命令的输出即为对象。可以将输出对象发送给另一条命令以作为其输入。从语言角度看,PowerShell属于一门动态的弱类型脚本解释语言。一个PowerShell脚本其实就是一个简单的文本文件,这个文件包含了一系列PowerShell命令,每个命令显示为独立的一行,PowerShell脚本文件名使用.PS1格式;

第一篇以powershell语法基础为主要记录。非完全记录,只记录遇到的点。

参考学习文档:PowerShell教程

二、语法

2.1、变量

1)变量多元赋值:

$x,$y,$z = 1,-1,1
$x
res: 1
$y
res: -1
$z
res: 1
#示例2:
$i,$j = 0,1,2
$i
res: 0
$j
res: 1,2 # 这里j变量显然变成是数组,我们来验证一下
$j -is [array] 
res: True  #这里看到确实数组类型
#示例3,将数组传入变量
$a,$b = 0,(1..5)
$a
res: 0
$b
res: 1
     2
     3
     4
     5
#PowerShell会根据数据自动分配最适合的数据类型,不用担心数据超出原定数据类型的上限而导致数据溢出;可以通过GetType()方法中Name属性获取PowerShell为你的变量选择的数据类型,这种类型自适应也称“弱类型”,那么对应的就有“强类型”
$a.gettype().name
Int32
$b.gettype().name
Object[]
#“强类型”
int]$i = "11"
$i.gettype().name
Int32

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2)Powershell内置变量

1.$$
此变量用于表示会话接收到的最后一行中的最后一个令牌。
2.$?
此变量用于表示最后一个操作的执行状态。如果没有错误,则返回True,否则返回False。
3.$^
此变量用于表示会话接收到的最后一行中的第一个令牌。
4.$_
此变量充当$PSItem,它在管道对象中包含当前对象。
5.$args
此变量包含未声明参数的值的数组,这些值传递给脚本,函数或脚本块。
6.$ConsoleFileName
此变量用于表示控制台文件的路径,该文件最近在会话中使用。
7.$Error
此变量用于包含代表最新错误的错误对象数组。
8.$Event
此变量用于包含PSEventArgs的对象。PSEventArgs是用于表示正在处理的事件的对象。
9.$EventSubscriber
此变量用于包含PSEventSubscriber的对象。该对象包含正在处理的事件的事件订阅者。
10.$EventArgs
此变量用于包含一个对象,该对象表示第一个事件的参数。
11.$false
此变量用于表示False。
12.$foreach
此变量用于包含ForEach循环的枚举数。该变量仅在执行ForEach循环时存在。并在循环完成后删除。
13.$Home
此变量用于表示用户主目录的完整路径
14.$input
此变量包含一个枚举器,该枚举器枚举传递给该函数的所有输入。它仅适用于脚本块和功能。
15.$Host
此变量包含一个对象,该对象显示Windows PowerShell的当前主机应用程序。
16.$IsLinux
如果当前会话在Linux操作系统上运行,则此变量值为$True,否则为$False。
17.$IsWindows
如果当前会话在Windows操作系统上运行,则此变量值为$True,否则为$False。
18.$IsMacOS
如果当前会话在MacOS操作系统上运行,则此变量值为$True,否则为$False。
19.$null
此变量用于表示null值或空值。可以使用它来表示脚本和命令中缺少或未定义的值。
20.$PID
此变量显示进程的PID,该进程正在托管当前PowerShell的会话。
21.$PSItem
此变量充当$_,它在管道对象中包含当前对象。
22.$PSHome
此变量表示Windows PowerShell安装目录的完整路径。
23.$PSVersionTable
此变量用于表示只读哈希表,该哈希表显示有关当前会话中运行的PowerShell版本的详细信息。
24.$PWD
此变量用于包含路径对象,该路径对象显示当前目录的完整路径。
25.$ShellId
此变量用于表示当前Shell的标识符。

2.2、常用的存储数据类型

1)数组 : [Array]

定义数组有三种方式:

$arr1 = @(1,2,3,4,5) #使用@符号,可以将列表内容转换成一个数组
$arr2 = (1,2,3,4,5)
$arr3 = 1…5
注:procs变量是一个多行文本,加@将其变为一个数组;使用变量时你也可以使用@符号,为了确保它作为数组而不是单个值处理
$procs = @{name=“explorer”,“svchost”}
Get-Process @procs //执行后,系统将显示Windows资源管理器和Svchost使用的所有进程

$arr1 = @() # 创建空数组 
$arr1.count  # 验证数组是否为空的,没有元素
res: 0
$arr2 = (1,2,3,4,5) # 定义固定长度的数组 
res:1,2,3,4,5
$arr3 = 1..5 # 利用语法糖“..”(运算符)定义数组 
res: 1,2,3,4,5

如果想判断数据类型,可按如下操作:

判断数据类型 : 使用类型运算符
-is 是 判断类型是否与预测的类型一样,是,返回True;不是,返回False
-isnot 不是 判断类型是否与预测的类型不一样,是,返回Ture;不是,返回False
-as 当作 试图转换类型,成功,返回该转换后的对象;若失败,返回$null

$arr1 -is [Array] # 用类型运算符进行验证是否为数组类型 
res: True
1..5 -is [Array] # 可看出“..”,应该是数组运算符
res: True
$arr2.length # 获取数组长度 
res: 5 
$arr2.count # 获取数组个数 
res: 5 
<# 查:通过下标访问数组元素 #>
$arr2[2] # 获取数组元素,下标从零开始 
res: 3
$arr2[1,3,4] # 获取数组多个元素,下标用“,”隔开 
res: 2,4,5
$arr4 = $arr2[-1,1,0] # 还可以做数组赋值给变量 
$arr4 
res: 5,2,1
<# 增:追加元素 增添元素 #>
$arr4 += 6
$arr4 += 7
$arr4
res: 5,2,1,6,7
<# 改: 通过下标修改元素 #>
$arr4[0] = -1
$arr4
res: -1,2,1,6,7
<# 删:用这个方法只能去头去尾,中间元素动不了 #>
$arr4 = $arr4[1..($arr4.length-1)]
$arr4
res: 2,1,6,7
$arr4.length # 查看数组长度的变化
res: 4
$arr4 = $arr4[0..($arr4.length-2)]
$arr4
res: 2,1,6
<# 数组元素逆向排序 #>
$arr3 = $arr3[($arr3.length-1)..0]
$arr3
res: 5,4,3,2,1
<# 复制克隆数组 克隆操作是真实的值,唔系值的引用地址 #>
$arr5 = $arr3.clone()
$arr5
res: 5,4,3,2,1
$arr3[0] = -1
$arr3
res: -1,4,3,2,1
$arr5
res: 5,4,3,2,1

2)哈希表: [Hash]

定义哈希表: 跟数组定义类似

$dict = @{ } # 创建空哈希表
$dict = @{ Name = “junn”,Age = $null }

示例:

$dict = @{
    
    Author = "junn";Write_Content = "PowerShell"} 
$dict 
Name                           Value
----                           -----
Author                         junn
Write_Content                  PowerShell
<# 查 #>
$key = "Author" 
$dict.$key # 访问键来获取键值 
res: junn 
$keys = "Author","Write_Content" 
$dict[$keys] # 通过创建数组方式,来获取多个键值 
res: Author --- junn
res: Write_Content --- PowerShell 
$dict1 = @{
    
     Work_Content = 10;Work_Out = 5,2,1} 
$dict1.Work_Out 
res: 5 
res: 2 
res: 1
<# 增 #>
$dict1["Work_Attention"] = 5
$dict
res: Work_Content --- 10
res: Work_Out --- {
    
    5,2,1}
res: Work_Attention --- 5
<# 删 #>
$dict1.remove("Work_Attention")
<# 改 #>
$key = "Work_Content"
$dict[$key] = 3
$dict[$key]
res: 3

三、函数

四、循环和判断

五、其他

5.1 powershell 模糊查询

function Check-ADUser
{
    
    
    Param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [String] $Key,
        [switch] $Force
    )

    # 确定查找内容
    $Identities = @()
    if (Test-Path $Key) {
    
    
        $Identities += Get-Content $Key -encoding UTF8
    } else {
    
    
        $Identities += $Key
    }
    
    # 开始查找
    $Users = @()
    for ($i = 0; $i -lt $Identities.Count; $i++) {
    
    
        if ($Force) {
    
    
            $filter = "SamAccountName -eq `"$($Identities[$i])`""
        } else {
    
    
            $filter = "Name -like `"*$($Identities[$i])*`" -or EmployeeID -like `"*$($Identities[$i])*`" -or SamAccountName -eq `"$($Identities[$i])`""
        }
        #$userOfMain = Get-ADUser -Filter "$filter" -SearchBase 'OU=Vxi_Users_SH,DC=vxichina,DC=com' -Properties EmployeeID,Description,whenCreated,whenChanged,LockedOut,lockoutTime,LastLogonDate,UserWorkstations,AccountExpirationDate,MobilePhone,State -ErrorAction SilentlyContinue
        #$userOfSub =  Get-ADUser -Filter "$filter" -SearchBase 'OU=Apple_Users_SH,DC=apple,DC=vxichina,DC=com' -Properties EmployeeID,Description,whenCreated,whenChanged,LockedOut,lockoutTime,LastLogonDate,UserWorkstations,AccountExpirationDate,MobilePhone,State -server "ACMDCSH1.apple.vxichina.com" -ErrorAction SilentlyContinue
        $userOfMain = Get-ADUser -Filter "$filter" -SearchBase 'DC=vxichina,DC=com' -Properties EmployeeID,Description,whenCreated,Modified,LockedOut,lockoutTime,LastLogonDate,UserWorkstations,AccountExpirationDate,ipPhone,State,PasswordNeverExpires,passwordlastset,pwdLastSet,telephoneNumber -ErrorAction SilentlyContinue
        $userOfSub =  Get-ADUser -Filter "$filter" -SearchBase 'DC=apple,DC=vxichina,DC=com' -Properties EmployeeID,Description,whenCreated,Modified,LockedOut,lockoutTime,LastLogonDate,UserWorkstations,AccountExpirationDate,ipPhone,State,PasswordNeverExpires,passwordlastset,pwdLastSet,telephoneNumber -server "ACMDCSH1.apple.vxichina.com" -ErrorAction SilentlyContinue
        $Users += $userOfMain
        $Users += $userOfSub
    }

    # 判断特殊状态
    for ($j = 0; $j -lt $Users.Count; $j++) {
    
    
        $lockouttime=$Users[$j].lockoutTime
        if ($lockouttime -gt 0 -and $users.LockedOut -eq $true) {
    
    
            $time=[DateTime]::FromFileTime($lockouttime)
            Add-Member -InputObject $Users[$j] -MemberType NoteProperty -Name LockoutTimeStream -Value $time -Force
        }
        if ($Users[$j].AccountExpirationDate) {
    
    
            $diffTime = $($Users[$j].AccountExpirationDate) - $([datetime]::Now)
            $days = $diffTime.Days
            if ($days -ge 0) {
    
    
                $expires = "账户将在${days}天后过期"
            } else {
    
    
                $days=[Math]::Abs($days)
                $expires="账户已过期${days}天"
            }
            Add-Member -InputObject $Users[$j] -MemberType NoteProperty -Name Expires -Value $expires -Force
        }
        if ($Users[$j].Enabled -eq $false) {
    
    
            Add-Member -InputObject $Users[$j] -MemberType NoteProperty -Name Status -Value "已禁用" -Force
        }
        if ($Users[$j].PasswordNeverExpires) {
    
    
            Add-Member -InputObject $Users[$j] -MemberType NoteProperty -Name PasswordExpires -Value "设置了帐户为密码永不过期" -Force
        } else {
    
    
            if ($Users[$j].pwdLastSet -eq 0) {
    
    
                Add-Member -InputObject $Users[$j] -MemberType NoteProperty -Name PasswordExpires -Value "帐户属性设置为用户下次登录时须更改密码" -Force
                
            } else {
    
    
                $ed = 90 - $($(Get-Date) - $Users[$j].PasswordLastSet).Days
                Add-Member -InputObject $Users[$j] -MemberType NoteProperty -Name PasswordExpires -Value "密码过期剩余天数为${ed}" -Force
            }
        }
    }
    Write-Host -Foreground White -BackgroundColor DarkRed -object "--查询开始--------------------------------------------------------------"
    $Users
    Write-Host -Foreground White -BackgroundColor DarkRed -object "--查询结束--------------------------------------------------------------"
    Write-Host -Foreground White -BackgroundColor DarkRed -object "--查询结果:$($Users.Count)"

猜你喜欢

转载自blog.csdn.net/ximenjianxue/article/details/123061837