简单的Powershell脚本

[复制链接]
发表于 2025-9-28 19:37:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次

  • 简单相识Powershell脚本

    • 在 PowerShell 中发现下令

      • 利用 Get-Member 发现对象
      • 按范例搜刮
      • 利用 Select-Object 筛选 Get-Member 效果

    • 选择数据

      • 获取完备相应
      • 排序
      • 利用格式设置和筛选

    • 编写你的第一个 PowerShell 代码

      • Hello World!
      • Powershell 中的编译代码
      • 底子语法熟悉

        • 须知
        • 查察设置文件
        • 声明参数
        • if elseif else
        • 错误处理处罚



  • PowerShell变量、数组和哈希表

    • 变量

      • 创建变量
      • 变量范例
      • 变量的方法和属性
      • 字符串变量和方法
      • 日期变量和方法

        • DateTime 属性
        • DateTime 方法


    • 数组和哈希表

      • 界说数组
      • 数组的属性和方法获取
      • 利用数组列表
      • 界说哈希表
      • 利用哈希表



简单相识Powershell脚本

在 PowerShell 中发现下令

利用 Get-Member 发现对象


  • Get-Member的作用:
    探查任何 PowerShell 下令输出对象的属性(Property) 和方法(Method)
  • 查察全部方法
    这里会输出Get-Process 全部历程的方法
  1. Get-Process | Get-Member -MemberType Method
复制代码

  • -Name: 按名称查找特定成员(支持通配符)
    这里会输出你 Get-Process 全部历程的有关于"*Handle*"这个通配符匹配的方法和属性
  1. Get-Process | Get-Member -Name "*Handle*"
复制代码

  • 假如你要查察指定的历程、服务等等,你可以先举行筛选再给到Get-Member获取他的内容

    • 着实和不指定历程的时间没有区别:两种利用方式,Get-Member 表现的都是 System.Diagnostics.Process 范例的方法列表,与具体是哪个历程实例、有多少个实例无关。
    • Get-Member 的用途:探索对象范例的布局和本领(有哪些属性和方法)。

  1. # 获取ctfmon进程的所有方法
  2. Get-Process -Name ctfmon | Get-Member -MemberType Method
  3. 等同于
  4. Get-Process | Get-Member -MemberType Method
复制代码
现实利用

  • 属性查察
  1. # 先通过Get-Member 获取某个东西的属性(不一定是进程),看你要查看哪个属性
  2. Get-Process -Name 'ctfmon' | Get-Member -MemberType Properties
  3. # 比如我查看了所有属性,想要查看Path属性,用法如下:
  4. (Get-Process -Name 'ctfmon').Path
复制代码

  • 方法利用
  1. # 先通过Get-Member 获取某个东西的方法有哪些(不一定是进程),看你要使用哪个方法
  2. # 其实可以不指定进程名字,因为我们对进程的操作方法一般都是一样的!!!上面也有对此进行解释
  3. # 不过我还是觉得-Name 指定一下好点,养成好习惯,尽可能减少失误的可能性
  4. Get-Process | Get-Member -MemberType Method
复制代码
按范例搜刮

假设你调用了 PowerShell 下令来列出特定历程的全部成员。 效果的前几行看起来雷同于以下输出:
  1. TypeName: System.Diagnostics.Process
  2. Name                       MemberType     Definition
  3. ----                       ----------     ----------
  4. Handles                    AliasProperty  Handles = Handlecount
复制代码
第一行指示范例为 System.Diagnostics.Process。 利用此范例作为搜刮参数,查找利用此范例的其他 cmdlet。 下面是一个示例下令:
  1. Get-Command -ParameterType Process
  2. # 当然也可以直接输入全称
  3. Get-Command -ParameterType System.Diagnostics.Process
复制代码
利用 Select-Object 筛选 Get-Member 效果

Select-Object 就是筛选特定列,决定要表现的列。
没啥好说的,不但仅是搭配Get-Member,很多都可以,这里只是一个小例子
请记着,返回的答案已是相应中全部列的子集。
须要一个逗号分隔的列名称列表,可以利用通配符对列名举行匹配
  1. Get-Process -Name 'ctfmon' | Get-Member | Select-Object Name, MemberType
复制代码
选择数据

获取完备相应

有两种方法:
  1. Get-Process ctfmon | Format-List -Property *
  2. Get-Process ctfmon | Select-Object *
复制代码
排序

在管道中利用 Sort-Object 时,PowerShell 先利用默认属性对输出数据排序。
假如不存在此类属性,它会实验比力对象自己。

  • 可以选择按特定列排序
    降序对列 Name 举行排序
  1. Get-Process | Sort-Object -Descending -Property Name
复制代码

  • 自界说表达式按列 Name 和 CPU 举行排序,并控制每列的排序次序
    起首按历程名称的字母逆序(Z-A)分列全部名为 'some process' 的历程,对于名称雷同的历程,再按 CPU 利用量的升序(低到高)举行分列。
  1. Get-Process 'some process' | Sort-Object -Property @{Expression = "Name"; Descending = $True}, @{Expression = "CPU"; Descending = $False}
复制代码
利用格式设置和筛选

精确设置格式,将格式设置作为末了一项利用
比如下面这个就输出空值,由于已经格式化了,不是对象了,以是select-objetc后选不到对象即为空值:
  1. Get-Process 'ctfmon' | Format-Table Name,CPU | Select-Object Name, CPU
复制代码
关键在于 Format-Table、Format-List 等格式化下令的输出不再是原始的历程对象,而是专门用于格式化表现的格式化指令对象 。
再次夸大一遍:精确设置格式,将格式设置作为末了一项利用
编写你的第一个 PowerShell 代码

若运行不了脚本,请实验:

  • 管理员运行powershell
  • 假如实行不了可以设置一下战略(暂时):Set-ExecutionPolicy

    • 然后输入:RemoteSigned

表明:

  • Set-ExecutionPolicy:假如利用的是 Windows 盘算机,则可以利用此 cmdlet 更改实行战略的值。 它采取 -ExecutionPolicy 参数。

    • Restricted 表现无法运行脚本
    • RemoteSigned 表现可以运行在当地盘算机上编写的脚本

Hello World!


  • Read-Host:吸取用户输入

    • -Prompt 提示信息

  • $name 为变量,用于吸取用户输入的内容
  1. $name = Read-Host -Prompt "Please enter your name"
复制代码
须要注意的是:Read-Host是会return用户输入的值的,以是说假如你不消变量吸取的情况下,比如你直接在终端输入Read-Host -Prompt "lease enter your name",用户输入完成后,会直接输出在终端。

  • Write-Output
    相当于cmd的echo
    你可以通过Get-Alias -Definition Write-Output来查察是不是,同时还会发现另一个别名:write
  • 直接将$name放在字符串内里,由于我们上面已经通过用户的输入给$name变量一个值了
  1. Write-Output "Congratulations $name! You have written your first code with PowerShell!"
复制代码
输出如下:

练习:
获取时间 && 用户输入
  1. # Today's date is <current date>.
  2. # Today is the day <your name> began a PowerShell programming journey.
  3. $date = Get-Date
  4. $name = Read-Host -Prompt "Plz enter your name"
  5. Write-Output "Today's date is $date."
  6. Write-Output "Today is the day $name began a PowerShell programming journey."
复制代码
Powershell 中的编译代码

PowerShell 被编译成抽象语法树 (AST),起首在内存中,然后运行。 但要利用 PowerShell,你不须要在这里举行深入研究。 你所须要知道的是,盘算机在查找重要标题时起首查抄 AST 中的代码。 然后,假如统统正常,则盘算机遇运行步伐,而不须要编译的可实行步伐。 此方法非常有用,由于它可确保代码在盘算机运行代码之前精确运行。 否则,大概会由于语法错误而举行更改并克制。 相比之下,Python 等表明型语言会不停运行代码,直到发现语法中有错误。
底子语法熟悉

学习目标

  • 编写并运行脚本。
  • 利用变量和参数增长脚本的机动性
  • 应用流控制逻辑做出明智的决定
  • 通过添加错误管理增长脚本的可靠性
须知


  • powershell中转义符号是反引号:( ` )
  • 变量用$ 符号
  • $( 表达式 ) :双引号内利用这个可以对变量举行表达式利用
    "表达式:$($PI + 1)" 那这个就是表如今该字符串中先对变量$PI举行了加一利用后再输出整个字符串。
查察设置文件

查察全部差别作用范围的设置文件
  1. $Profile | Select-Object *
复制代码
选择你要编辑的设置文件,将自界说项添加到文本文件并生存。 下一次启动会话时,将应用所做的更改。


  • 实验修改当前设置文件:
  1. New-Item -ItemType "file" -Value 'Write-Host "Hello xxx, Welcome back" -foregroundcolor Green' -Path $Profile.CurrentUserCurrentHost -Force
复制代码

声明参数
  1. # CreateFile.ps1
  2. Param (
  3.   $Path
  4. )
  5. New-Item $Path # Creates a new file at $Path.
  6. Write-Host "File $Path was created"
复制代码

  • 利用的时间就有用:
    ./CreateFile.ps1 -Path './newfile.txt'
表明:
  1. 很明显了,上面就是通过使用Param() 来定义参数,变量名就是参数名,使用的时候用 - 符号 加上变量名即可传入值到变量中为后续脚本代码的使用。
复制代码
作为一名专业的技能职员,我们不能仅仅只思量脚本在抱负情况下见效,还须要思量各种情况。
界说参数时,须要思量以下事项:

  • 是否必须? 参数是可选的还是必须的?
  • 答应哪些值? 哪些值公道?
  • 它是否担当多种范例的值? 参数是否担当任何范例的值,如字符串、布尔值、整数和对象?
  • 参数能否依靠于默认值? 是否可以完全省略值并改为依靠于默认值?
  • 可以进一步改进用户体验吗? 是否可以通过提供资助消息为用户提供更清楚的提示?
利用 If/Else。 利用 If/Else 构造,可以查抄参数的值,然后确定要实行的利用。 下面是一个示例:
假如没有为 Write-Error 提供值,则脚本将运行 $Path
  1. Param(
  2.    $Path
  3. )
  4. If (-Not $Path -eq '') {
  5.    New-Item $Path
  6.    Write-Host "File created at path $Path"
  7. } Else {
  8.    Write-Error "Path cannot be empty"
  9. }
复制代码
利用 Parameter[] 修饰器
更好的方法是利用 Parameter[] 修饰器
它可以自己完成简单的检测,不消我们自己去判断是否空值:
假如运行此脚本并省略 $Path 的值,则会出现一个提示该值缺失的对话框:
  1. Param(
  2.    [Parameter(Mandatory)]
  3.    $Path
  4. )
  5. New-Item $Path
  6. Write-Host "File created at path $Path"
复制代码
假如运行此脚本并省略 $Path 的值,则会出现一个提示该值缺失的对话框:
  1. cmdlet CreateFile.ps1 at command pipeline position 1
  2. Supply values for the following parameters:
  3. Path:
复制代码
可通过为用户提供资助消息来改进此修饰器,用户在运行脚本时将看到该消息:
  1. [Parameter(Mandatory, HelpMessage = "Please provide a valid path")]
复制代码
运行脚本时,你会收到一条消息,提示须要键入 !? 获取具体信息:
  1. cmdlet CreateFile.ps1 at command pipeline position 1
  2. Supply values for the following parameters:
  3. (Type !? for Help.)
  4. Path: !?  # You type !?
  5. Please provide a valid path  # Your Help message.
复制代码
分配范例。 比方,假如为参数分配范例,你可以指定该参数只担当字符串,而不担当布尔值。 如许,用户就知道了渴望效果。 可以在参数前面加上范例(用括号括住),为该参数分配范例:
  1. Param(
  2.    [string]$Path
  3. )
复制代码
练习
实验写一个备份当前目次文件的脚本
  1. # backup test file
  2. $date = Get-Date -Format "yyyy_MM_dd"
  3. Compress-Archive -Path "./" -CompressionLevel Fastest -DestinationPath "backup_$date.zip"
  4. Write-Output "Success Backup to ./backup_$date.zip"
复制代码
该脚本调用 Compress-Archive 并利用以下这三个参数:

  • -Path,这是要压缩的文件的目次。
  • -CompressionLevel,用于指定文件的压缩量。
  • -DestinationPath,这是所天生的压缩文件的名字。
实验将参数添加到脚本,而不是固定的路径
  1. # backup test file
  2. Param(
  3.         [Parameter(Mandatory, HelpMessage = 'Please check the path and destination path')]
  4.     [String]$Path = './',
  5.     [String]$Destination = './'
  6. )
  7. $date = Get-Date -Format "yyyy_MM_dd_HH_mm_ss"
  8. Compress-Archive -Path "$Path" -CompressionLevel Fastest -DestinationPath "$($Destination + 'backup_' + $date + '.zip')"
  9. Write-Output "$('Success Backup to' + $Destination + 'backup_' + $date + '.zip')"
复制代码
if elseif else

运算符

  • PowerShell 提供了两个内置参数,用于确定表达式是 True 还是 False:

    • $True 指示表达式为 True。
    • $False 指示表达式为 False。

  • le:小于
  • gt:大于
  • eq:即是
  • -Not:否,取反
If
  1. If(表达式){
  2.         xxx
  3. }
复制代码
Else
  1. If(表达式1){
  2.         xxx
  3. }Else{
  4.         xxx
  5. }
复制代码
ElseIf
  1. If(表达式1){
  2.         xxx
  3. }ElseIf(表达式2){
  4.         xxx
  5. }ElseIf(表达式3){
  6.         xxx
  7. }Else{
  8.         xxx
  9. }
复制代码
练习:
按照上面我的写的一个备份脚本,这个缺点是当我们就算路径不存在还是会去实验实行全部代码,那我们就可以利用上if else等等来举行一个流处理处罚。
  1. # backup test file
  2. Param(
  3.     [String]$Path = './',
  4.     [String]$Destination = './'
  5. )
  6. if(-Not(Test-Path $Path)){ # if dir not exist
  7.     Throw "The source directory $Path does not exist, please specify an existing directory"
  8. }
  9. If (-Not (Test-Path $Destination)){
  10.     Throw "The source directory $Path does not exist, please specify an existing directory"
  11. }Else{
  12.     $date = Get-Date -Format "yyyy_MM_dd_HH_mm_ss"
  13.     Compress-Archive -Path "$Path" -CompressionLevel Fastest -DestinationPath "$($Destination + 'backup_' + $date + '.zip')"
  14.     Write-Output "$('Success Backup to' + $Destination + 'backup_' + $date + '.zip')"
  15. }
复制代码
这里涉及到了错误处理处罚,反面接着讲
错误处理处罚

利用 Try/Catch/Finally 管理错误
有三个干系构造可资助管理此类错误:

  • Try。 将利用 Try 块封装一个或多个语句。 将要运行的代码(比方,写入到数据源的代码)放在大括号内。 Try 必须至少有一个 Catch 或 Finally 块。 其如下所示:
  1. Try {
  2.    # Statement. For example, call a command.
  3.    # Another statement. For example, assign a variable.
  4. }
复制代码

  • Catch。 发生错误时,将利用此关键字捕捉或管理错误。 然后将查抄非常对象,以相识发生的错误的范例、发生的位置以及脚本是否可以规复。 Catch 紧跟在 Try 之后。 假如须要,可以包罗多个 Catch,每种范例的错误一个。 下面是一个示例:
  1. Try {
  2.    # Do something with a file.
  3. } Catch [System.IO.IOException] {
  4.    Write-Host "Something went wrong"
  5. }  Catch {
  6.    # Catch all. It's not an IOException but something else.
  7. }
复制代码
此脚本实验运行实行一些 I/O 工作的下令。 第一个 Catch 捕捉特定范例的错误:[System.IO.IOException]。 末了的 Catch 捕捉任何非 [System.IO.IOException] 的内容。

  • Finally。 不管是否出现错误,此块中的语句都将运行。 大概不会常利用此块,但它对整理资源很有用。 若要利用它,请将其添加为末了一个块:
  1. Try {
  2.    # Do something with a file.
  3. } Catch [System.IO.IOException] {
  4.    Write-Host "Something went wrong"
  5. }  Catch {
  6.    # Catch all. It's not an IOException but something else.
  7. } Finally {   # Clean up resources.}
复制代码
错误信息剖析:
我们在捕捉错误的上下文中已经讨论过非常对象。 你可以利用这些对象来检盘标题地点,并采取相应的步伐。 非常对象包罗:

  • A message:消息会简单阐明标题地点。
  • The stacktrace:Stacktrace 将指出在发生错误之前运行了哪些语句。 假设你先后调用了函数 A、B、C。脚本在 C 处克制相应。Stacktrace 将表现此调用链。
  • The offending row:非常对象还会表现错误发生时脚本正在运行的行。 此信息有助于调试代码。
那么,怎样查抄非常对象呢? 有一个内置的变量 $_,该变量具有 exception 属性。 比方,可利用 $_.exception.message 获取错误消息。 在代码中,它大概如下所示:
  1. Try {
  2.      # Do something with a file.
  3.    } Catch [System.IO.IOException] {
  4.      Write-Host "Something IO went wrong: $($_.exception.message)"
  5.    }  Catch {
  6.      Write-Host "Something else went wrong: $($_.exception.message)"
  7.    }
复制代码
自界说处理处罚动作

  • Continue
  • Ignore:比 SilentlyContinue 更彻底。既不表现错误,也不将其记录到 $Error 变量中。就像错误从未发生过一样。
  • Inquire:扣问,当错误发生时,停息实行并向用户扣问下一步利用(Y-继续, A-全部继续, H-挂起, ?-资助)。
  • SilentlyContinue:静默继续,不在屏幕上表现错误信息,但错误仍然会被记录到主动变量 $Error 中。下令继续实行。
  • Stop:克制
  • Suspend:挂起,此参数仅实用于 PowerShell 工作流 (Workflow)。当错误发生时,工作流会停息并答应用户观察,然后可以选择规复或停止。
  1. Try {
  2.    Get-Content './file.txt' -ErrorAction Stop
  3. } Catch {
  4.    Write-Error "File can't be found"
  5. }
复制代码
Throw 抛出

  • 假如非常未被任何 Catch 块捕捉,终极会表现在控制台上。
  • 在 Catch 块中:通过 $_ 或 $PSItem 变量访问。
  1. Catch {
  2.     $ErrorMessage = $_.Exception.Message   # 获取错误信息
  3.     $ErrorType = $_.Exception.GetType().FullName # 获取错误类型
  4. }
复制代码

  • 主动变量 $Error:PowerShell 会主动将全部错误记录到全局的 $Error 数组中,最新的错误在索引 [0]。纵然非常被 Catch 处理处罚了,也依然会记录到 $Error 中。你可以利用 $Error[0] | FL * 查察一个错误的全部具体信息。
案例:
下面这个就是Throw抛出后,由于有catch,且catch将错误信息打印出来了,以是根据catch的错误信息拼接起来打印。
(否则一样寻常情况下,你直接Throw的话,他就是直接打印错误信息在终端上)
  1. Try {
  2.    If ($Path -eq './forbidden')
  3.    {
  4.      Throw "Path not allowed"
  5.    }
  6.    # Carry on.
  7. } Catch {
  8.    Write-Error "$($_.exception.message)" # Path not allowed.
  9. }
复制代码
PowerShell变量、数组和哈希表

变量

通过查察名为“变量”的 PowerShell 驱动器的内容来查察内存中包罗的变量,请利用以下下令:
  1. Get-ChildItem Variable:
  2. 或者直接使用↓↓,二者一样
  3. Get-Variable
复制代码
下面表现的变量,有的是你自己在当前session中界说的,有的是体系的。

你所看到的都可以通过添加一个$符号来打印出来他的值,当你反正你直接打印全部的时间已经是能看到他的值value了
创建变量

简单的创建就是直接$变量名
但是碰到有空格的那就须要添加大括号 { }
${log file}
变量名称不区分巨细写, 变量 $USER 和 $user 是可以互换的。
为了进步可读性,常见的约定是利用小写字符,并将变量名称中每个单词的第一个字母大写。
比方,$logFile 和 $LogFile 都是常用的。
但是当变量用于脚本中的参数时,第一个单词应大写,以便与 cmdlet 利用的参数保持同等。
↑↑这个很关键
  1. Param{
  2.         这里的参数就是建议使用大写第一个字母,因为这个参数变量在实际使用的时候可以tab出来,tab出来的大小写和你这里写的大小写一样,所以建议是使用第一个字母大小写,尽量和其他的cmdlet一致
  3. }
复制代码
另有一种方法创建变量:
利用此 cmdlet 时,在引用名称时不包罗 $ 符号,如以下示例所示
  1. Set-Variable -Name num1 -Value 5
复制代码
变量范例

假如未分配变量范例,Windows PowerShell 会根据赋给变量的值主动分配范例。
范例形貌String字符串变量存储可以包罗特殊字符的文本。 比方“This is a string.”Int32 位整型变量存储不带小数位的数字。 比方 228。Double64 位浮点变量存储可包罗小数位的数字。 比方 128.45。DateTimeDateTime 变量存储包罗日期和时间的日期对象。 比方 2022 年 1 月 5 日上午 10:00。Bool布尔变量只能存储值 $true 或 $false。若想要知道某个变量的范例,可以通过将 GetType() 方法追加到变量名厥后查察变量的范例。 比方:
  1. $date.GetType()
复制代码
变量的方法和属性

1.我们可以利用tab方式来查察,方法是输入变量名并在反面加上一个点,选择“Tab”键时,将表现可用于变量的属性和方法,如许会一个个给你提示出来,你自己逐步查察即可
2.表现特定变量的全部可用属性和方法
  1. $num1 | Get-Member
复制代码
字符串变量和方法

字符串变量常用于脚本中。 可以利用字符串来存储用户输入和其他文本数据。 有很多可用于利用字符串的方法。 此中有多种方法很少利用,但最好相识它们以备不时之需。
字符串变量只有一个属性,即“Length”。 查察字符串变量的长度时,它会返回字符串中的字符数。 比方:
  1. $logFile.Length
复制代码
下表列出了一些可用于字符串变量的方法。
方法阐明Contains(string value)确定变量是否包罗特定字符串。 效果为 $true 或 $false。Insert(int startindex,string value)在指定的字符下标处插入文本字符串。Remove(int startindex,int count)从字符串中删除指定命量的字符(从指定的字符下标开始)。 假如未指定计数,字符串会在指定的字符下标处被截断。Replace(string value,string value)用第二个字符串更换第一个字符串的全部实例。Split(char separator)在字符指定的点处将单个字符串拆分为多个字符串。ToLower()将字符串转换为小写。ToUpper()将字符串转换为大写。日期变量和方法

创建的很多脚本都须要引用当前日期或之前的时间点。 比方,若要确保唯一性,大概须要根据当前日期创建日志文件名。 别的,大概会在 AD DS 中搜刮很长时间都未登录的用户。 可以利用 DateTime 变量来完成这些使命。
DateTime 属性

DateTime 变量包罗日期和时间。
可以利用 DateTime 变量属性访问日期或时间的特定部门。 下表列出了 DateTime 变量的一些可用属性。
properties阐明Hour以 24 小时格式返回具体小时。Minute返回具体分钟。Second返回具体秒数。TimeOfDay返回一天具体时间的具体信息,包罗小时、分钟和秒。Date仅返回日期,不返回时间。DayOfWeek返回星期几,比方:星期一。Month以数字的情势返回月份。Year返回年份。DateTime 方法

DateTime 变量还提供了很多可用于利用时间的方法。
这些方法提供了添加或减去时间的方法,另有一些方法可用于以特定方式利用 DateTime 变量的输出。
下表列出了一些 DateTime 变量方法。
方法阐明AddDays(双精度值)添加指定天数。AddHours(双精度值)添加指定小时数。AddMinutes(双精度值)添加指定分钟数。AddMonths(整数月份)添加指定月数。AddYears(整数值)添加指定年份。ToLongDateString()以字符串情势返回长格式的日期。ToShortDateString()以字符串情势返回短格式的日期。ToLongTimeString()以字符串情势返回长格式的时间。ToShortTimeString()以字符串情势返回短格式的时间。数组和哈希表

界说数组

数组元素答应范例不一样
通过在逗号分隔的列表中提供多个值来创建数组
比方:
  1. $computers = "LON-DC1","LON-SRV1","LON-SRV2"
  2. $numbers = 228,43,102
复制代码
还可以利用下令的输出创建数组
比方:
  1. $users = Get-ADUser -Filter *
  2. $files = Get-ChildItem C:
复制代码
GetType() 方法来验证变量是否为数组,列出的 BaseType 将为 System.Array
  1. $arr=1,2,3,4
  2. $arr.GetType()
复制代码
可以在预备好将内容放入空数组之前创建空数组。 稍后在脚本中有一个向数组添加项的循环时,这会很有用
比方:
  1. $newUsers = @()
复制代码
还可以在向变量添加单个值时欺压创建数组。 这将创建一个具有单个值的数组,便于以后向此中添加项
比方:
  1. [array]$computers="LON-DC1"
复制代码
数组的属性和方法获取

这里是为了告诉你,数组和数组元素的属性和方法获取是差别的

  • 获取数组中每个项的属性和方法
  1. $arr | Get-Member
复制代码

  • 获取数组的属性和方法(这里不是获取数组元素的东西哈)
  1. Get-Member -InputObject $arr
复制代码
利用数组列表

每个项目分配一个从 0 开始的索引号
若要表现特定项,请将索引号放在变量名称反面的括号中
以下示例表现数组中存储在变量 $users 中的第一项:
  1. $arr[0]
复制代码
可以向数组添加新项,新项可以是单个元素也可以是列表,固然也可以是差别范例的数组:
  1. $arr = $arr + $arrtest
  2. # 在powershell中也有这种写法
  3. $arr += $arrtest
复制代码
上述都是说数组而已,他们的范例是 System.Array,不是数组列表ArrayList
Windows PowerShell 创建的默认数组范例是固定巨细的数组。 这意味着,将项添加到数组时,该数组现实上是利用附加项重新创建的。 利用相对较小的数组时,这不是标题。 但是,假如逐个向数组添加数千个项目,则每次重新创建数组都会对性能产生负面影响。 利用固定巨细的数组的另一个标题是删除项。 没有简单的方法可从固定巨细的数组中删除项。
若要在赋值时创建数组列表,请利用以下语法:
  1. [System.Collections.ArrayList]$computers = "LON-DC1","LON-SVR1","LON-CL1"
复制代码
若要创建空且已预备好添加项的数组列表,请利用以下语法:
  1. $computers=New-Object System.Collections.ArrayList
复制代码
利用数组列表时,可以利用方法来添加和删除项:
  1. $computers.Add("LON-SRV2")
  2. $computers.Remove("LON-CL1")
复制代码
假如要根据索引号从数组列表中删除项,请利用 RemoveAt() 方法。 比方:
  1. $computers.RemoveAt(1)
复制代码
界说哈希表

哈希表表现与数组雷同的概念,由于它存储多个项,但差别于数组利用索引号来确定每项,哈希表利用唯一键来实现这一点。
键是一个字符串,它是项的唯一标识符。 哈希表中的每个键都与值干系联。
利用哈希表来存储 IP 地点和盘算机名,如下表所示:
KeyValueLON-DC1192.168.0.10LON-SRV1192.168.0.11LON-SRV2192.168.0.12假如哈希表名为 $servers,可以利用以下恣意选项访问哈希表中的第一项:
  1. $servers.'LON-DC1'
  2. $servers['LON-DC1']
复制代码
由于我们的这个Key有特殊符号 -,以是须要引号包起来,若你的变量就是正常的没有啥特殊字符就可以直接利用而不消引号包裹。
利用哈希表

以下下令创建一个名为 $servers 的哈希表来存储服务器名称和 IP 地点:
  1. # 下面是放在单独的行,所以使用分号隔开
  2. $servers = @{"LON-DC1" = "172.16.0.10"; "LON-SRV1" = "172.16.0.11"}
  3. # 下面是每一项都单独一行,所以不用分号隔开
  4. $servers = @{
  5. "LON-DC1" = "172.16.0.10"
  6. "LON-SRV1" = "172.16.0.11"
  7. }
复制代码
请注意上面的示例中的以下语法:

  • 它以 @ 符号开头。
  • 键和关联的值括在大括号中。
  • 项之间用分号分隔。
更新键的值是直接赋值即可
  1. $servers."LON-SRV2"="172.16.0.100"
复制代码
查察哈希表可用的全部属性和方法
  1. $servers | Get-Member
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表