- 简单了解Powershell脚本
- 在 PowerShell 中发现命令
- 使用 Get-Member 发现对象
- 按类型搜索
- 使用 Select-Object 筛选 Get-Member 结果
- 选择数据
- 获取完整响应
- 排序
- 使用格式设置和筛选
- 编写你的第一个 PowerShell 代码
- Hello World!
- Powershell 中的编译代码
- 基础语法认识
- 须知
- 查看配置文件
- 声明参数
- if elseif else
- 错误处理
- 在 PowerShell 中发现命令
- PowerShell变量、数组和哈希表
- 变量
- 创建变量
- 变量类型
- 变量的方法和属性
- 字符串变量和方法
- 日期变量和方法
- DateTime 属性
- DateTime 方法
- 数组和哈希表
- 定义数组
- 数组的属性和方法获取
- 使用数组列表
- 定义哈希表
- 使用哈希表
- 变量
简单了解Powershell脚本
在 PowerShell 中发现命令
使用 Get-Member 发现对象
-
Get-Member的作用:
探查任何 PowerShell 命令输出对象的属性(Property) 和方法(Method) -
查看所有方法
这里会输出Get-Process 所有进程的方法
Get-Process | Get-Member -MemberType Method
-Name
: 按名称查找特定成员(支持通配符)
这里会输出你 Get-Process 所有进程的有关于"*Handle*"
这个通配符匹配的方法和属性
Get-Process | Get-Member -Name "*Handle*"
- 如果你要查看指定的进程、服务等等,你可以先进行筛选再给到Get-Member获取他的内容
- 其实和不指定进程的时候没有区别:两种操作方式,
Get-Member
显示的都是System.Diagnostics.Process
类型的方法列表,与具体是哪个进程实例、有多少个实例无关。 Get-Member
的用途:探索对象类型的结构和能力(有哪些属性和方法)。
- 其实和不指定进程的时候没有区别:两种操作方式,
# 获取ctfmon进程的所有方法
Get-Process -Name ctfmon | Get-Member -MemberType Method
等同于
Get-Process | Get-Member -MemberType Method
实际使用
- 属性查看
# 先通过Get-Member 获取某个东西的属性(不一定是进程),看你要查看哪个属性
Get-Process -Name 'ctfmon' | Get-Member -MemberType Properties# 比如我查看了所有属性,想要查看Path属性,用法如下:
(Get-Process -Name 'ctfmon').Path
- 方法使用
# 先通过Get-Member 获取某个东西的方法有哪些(不一定是进程),看你要使用哪个方法
# 其实可以不指定进程名字,因为我们对进程的操作方法一般都是一样的!!!上面也有对此进行解释
# 不过我还是觉得-Name 指定一下好点,养成好习惯,尽可能减少失误的可能性
Get-Process | Get-Member -MemberType Method
按类型搜索
假设你调用了 PowerShell 命令来列出特定进程的所有成员。 结果的前几行看起来类似于以下输出:
TypeName: System.Diagnostics.ProcessName MemberType Definition
---- ---------- ----------
Handles AliasProperty Handles = Handlecount
第一行指示类型为 System.Diagnostics.Process
。 使用此类型作为搜索参数,查找使用此类型的其他 cmdlet。 下面是一个示例命令:
Get-Command -ParameterType Process# 当然也可以直接输入全称
Get-Command -ParameterType System.Diagnostics.Process
使用 Select-Object 筛选 Get-Member 结果
Select-Object 就是筛选特定列,决定要显示的列。
没啥好说的,不仅仅是搭配Get-Member,很多都可以,这里只是一个小例子
请记住,返回的答案已是响应中所有列的子集。
需要一个逗号分隔的列名称列表,可以使用通配符对列名进行匹配
Get-Process -Name 'ctfmon' | Get-Member | Select-Object Name, MemberType
选择数据
获取完整响应
有两种方法:
Get-Process ctfmon | Format-List -Property *Get-Process ctfmon | Select-Object *
排序
在管道中使用 Sort-Object
时,PowerShell 先使用默认属性对输出数据排序。
如果不存在此类属性,它会尝试比较对象本身。
- 可以选择按特定列排序
降序对列Name
进行排序
Get-Process | Sort-Object -Descending -Property Name
- 自定义表达式按列
Name
和CPU
进行排序,并控制每列的排序顺序
首先按进程名称的字母逆序(Z-A)排列所有名为 'some process' 的进程,对于名称相同的进程,再按 CPU 使用量的升序(低到高)进行排列。
Get-Process 'some process' | Sort-Object -Property @{Expression = "Name"; Descending = $True}, @{Expression = "CPU"; Descending = $False}
使用格式设置和筛选
正确设置格式,将格式设置作为最后一项操作
比如下面这个就输出空值,因为已经格式化了,不是对象了,所以select-objetc后选不到对象即为空值:
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 为变量,用于接收用户输入的内容
$name = Read-Host -Prompt "Please enter your name"
需要注意的是:Read-Host是会return用户输入的值的,所以说如果你不用变量接收的情况下,比如你直接在终端输入Read-Host -Prompt "Please enter your name"
,用户输入完成后,会直接输出在终端。
- Write-Output
相当于cmd的echo
你可以通过Get-Alias -Definition Write-Output
来查看是不是,同时还会发现另一个别名:write
- 直接将
$name
放在字符串里面,因为我们上面已经通过用户的输入给$name
变量一个值了
Write-Output "Congratulations $name! You have written your first code with PowerShell!"
输出如下:
练习:
获取时间 && 用户输入
# Today's date is <current date>.
# Today is the day <your name> began a PowerShell programming journey.
$date = Get-Date
$name = Read-Host -Prompt "Plz enter your name"
Write-Output "Today's date is $date."
Write-Output "Today is the day $name began a PowerShell programming journey."
Powershell 中的编译代码
PowerShell 被编译成抽象语法树 (AST),首先在内存中,然后运行。 但要使用 PowerShell,你不需要在这里进行深入研究。 你所需要知道的是,计算机在查找主要问题时首先检查 AST 中的代码。 然后,如果一切正常,则计算机会运行程序,而不需要编译的可执行程序。 此方法非常有用,因为它可确保代码在计算机运行代码之前正确运行。 否则,可能会由于语法错误而进行更改并停止。 相比之下,Python 等解释型语言会一直运行代码,直到发现语法中有错误。
基础语法认识
学习目标
- 编写并运行脚本。
- 使用变量和参数增加脚本的灵活性
- 应用流控制逻辑做出明智的决策
- 通过添加错误管理增加脚本的可靠性
须知
- powershell中转义符号是反引号:( ` )
- 变量用$ 符号
- $( 表达式 ) :双引号内使用这个可以对变量进行表达式操作
"表达式:$($PI + 1)"
那这个就是表示在该字符串中先对变量$PI
进行了加一
操作后再输出整个字符串。
查看配置文件
查看所有不同作用范围的配置文件
$Profile | Select-Object *
选择你要编辑的配置文件,将自定义项添加到文本文件并保存。 下一次启动会话时,将应用所做的更改。
- 尝试修改当前配置文件:
New-Item -ItemType "file" -Value 'Write-Host "Hello xxx, Welcome back" -foregroundcolor Green' -Path $Profile.CurrentUserCurrentHost -Force
声明参数
# CreateFile.ps1
Param ($Path
)
New-Item $Path # Creates a new file at $Path.
Write-Host "File $Path was created"
- 使用的时候就有用:
./CreateFile.ps1 -Path './newfile.txt'
解释:
很明显了,上面就是通过使用Param() 来定义参数,变量名就是参数名,使用的时候用 - 符号 加上变量名即可传入值到变量中为后续脚本代码的使用。
作为一名专业的技术人员,我们不能仅仅只考虑脚本在理想情况下生效,还需要考虑各种情况。
定义参数时,需要考虑以下事项:
- 是否必需? 参数是可选的还是必需的?
- 允许哪些值? 哪些值合理?
- 它是否接受多种类型的值? 参数是否接受任何类型的值,如字符串、布尔值、整数和对象?
- 参数能否依赖于默认值? 是否可以完全省略值并改为依赖于默认值?
- 可以进一步改进用户体验吗? 是否可以通过提供帮助消息为用户提供更清楚的提示?
使用 If/Else
。 使用 If/Else
构造,可以检查参数的值,然后确定要执行的操作。 下面是一个示例:
如果没有为 Write-Error
提供值,则脚本将运行 $Path
Param($Path
)
If (-Not $Path -eq '') {New-Item $PathWrite-Host "File created at path $Path"
} Else {Write-Error "Path cannot be empty"
}
使用 Parameter[]
修饰器
更好的方法是使用 Parameter[]
修饰器
它可以自己完成简单的检测,不用我们自己去判断是否空值:
如果运行此脚本并省略 $Path
的值,则会出现一个提示该值缺失的对话框:
Param([Parameter(Mandatory)]$Path
)
New-Item $Path
Write-Host "File created at path $Path"
如果运行此脚本并省略 $Path
的值,则会出现一个提示该值缺失的对话框:
cmdlet CreateFile.ps1 at command pipeline position 1
Supply values for the following parameters:
Path:
可通过为用户提供帮助消息来改进此修饰器,用户在运行脚本时将看到该消息:
[Parameter(Mandatory, HelpMessage = "Please provide a valid path")]
运行脚本时,你会收到一条消息,提示需要键入 !?
获取详细信息:
cmdlet CreateFile.ps1 at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
Path: !? # You type !?
Please provide a valid path # Your Help message.
分配类型。 例如,如果为参数分配类型,你可以指定该参数只接受字符串,而不接受布尔值。 这样,用户就知道了期望结果。 可以在参数前面加上类型(用括号括住),为该参数分配类型:
Param([string]$Path
)
练习
尝试写一个备份当前目录文件的脚本
# backup test file$date = Get-Date -Format "yyyy_MM_dd"
Compress-Archive -Path "./" -CompressionLevel Fastest -DestinationPath "backup_$date.zip"
Write-Output "Success Backup to ./backup_$date.zip"
该脚本调用 Compress-Archive
并使用以下这三个参数:
-Path
,这是要压缩的文件的目录。-CompressionLevel
,用于指定文件的压缩量。-DestinationPath
,这是所生成的压缩文件的名字。
尝试将参数添加到脚本,而不是固定的路径
# backup test fileParam([Parameter(Mandatory, HelpMessage = 'Please check the path and destination path')]
[String]$Path = './',
[String]$Destination = './'
)$date = Get-Date -Format "yyyy_MM_dd_HH_mm_ss"
Compress-Archive -Path "$Path" -CompressionLevel Fastest -DestinationPath "$($Destination + 'backup_' + $date + '.zip')"
Write-Output "$('Success Backup to' + $Destination + 'backup_' + $date + '.zip')"
if elseif else
运算符
- PowerShell 提供了两个内置参数,用于确定表达式是
True
还是False
:$True
指示表达式为True
。$False
指示表达式为False
。
- le:小于
- gt:大于
- eq:等于
- -Not:否,取反
If
If(表达式){xxx
}
Else
If(表达式1){xxx
}Else{xxx
}
ElseIf
If(表达式1){xxx
}ElseIf(表达式2){xxx
}ElseIf(表达式3){xxx
}Else{xxx
}
练习:
按照上面我的写的一个备份脚本,这个缺点是当我们就算路径不存在还是会去尝试执行所有代码,那我们就可以利用上if else等等来进行一个流处理。
# backup test fileParam(
[String]$Path = './',
[String]$Destination = './'
)
if(-Not(Test-Path $Path)){ # if dir not exist
Throw "The source directory $Path does not exist, please specify an existing directory"
}
If (-Not (Test-Path $Destination)){
Throw "The source directory $Path does not exist, please specify an existing directory"
}Else{
$date = Get-Date -Format "yyyy_MM_dd_HH_mm_ss"
Compress-Archive -Path "$Path" -CompressionLevel Fastest -DestinationPath "$($Destination + 'backup_' + $date + '.zip')"
Write-Output "$('Success Backup to' + $Destination + 'backup_' + $date + '.zip')"
}
这里涉及到了错误处理,后面接着讲
错误处理
使用 Try/Catch/Finally
管理错误
有三个相关构造可帮助管理此类错误:
Try
。 将使用Try
块封装一个或多个语句。 将要运行的代码(例如,写入到数据源的代码)放在大括号内。Try
必须至少有一个Catch
或Finally
块。 其如下所示:
Try {# Statement. For example, call a command.# Another statement. For example, assign a variable.
}
Catch
。 发生错误时,将使用此关键字捕获或管理错误。 然后将检查异常对象,以了解发生的错误的类型、发生的位置以及脚本是否可以恢复。Catch
紧跟在Try
之后。 如果需要,可以包括多个Catch
,每种类型的错误一个。 下面是一个示例:
Try {# Do something with a file.
} Catch [System.IO.IOException] {Write-Host "Something went wrong"
} Catch {# Catch all. It's not an IOException but something else.
}
此脚本尝试运行执行一些 I/O 工作的命令。 第一个 Catch
捕获特定类型的错误:[System.IO.IOException]
。 最后的 Catch
捕获任何非 [System.IO.IOException]
的内容。
Finally
。 不管是否出现错误,此块中的语句都将运行。 可能不会常使用此块,但它对清理资源很有用。 若要使用它,请将其添加为最后一个块:
Try {# Do something with a file.
} Catch [System.IO.IOException] {Write-Host "Something went wrong"
} Catch {# Catch all. It's not an IOException but something else.
} Finally {# Clean up resources.
}
错误信息解析:
我们在捕获错误的上下文中已经讨论过异常对象。 你可以使用这些对象来检查问题所在,并采取相应的措施。 异常对象包含:
- A message:消息会简单说明问题所在。
- The stacktrace:Stacktrace 将指出在发生错误之前运行了哪些语句。 假设你先后调用了函数 A、B、C。脚本在 C 处停止响应。Stacktrace 将显示此调用链。
- The offending row:异常对象还会显示错误发生时脚本正在运行的行。 此信息有助于调试代码。
那么,如何检查异常对象呢? 有一个内置的变量 $_
,该变量具有 exception
属性。 例如,可使用 $_.exception.message
获取错误消息。 在代码中,它可能如下所示:
Try {# Do something with a file.} Catch [System.IO.IOException] {Write-Host "Something IO went wrong: $($_.exception.message)"} Catch {Write-Host "Something else went wrong: $($_.exception.message)"}
自定义处理动作
- Continue
- Ignore:比
SilentlyContinue
更彻底。既不显示错误,也不将其记录到$Error
变量中。就像错误从未发生过一样。 - Inquire:询问,当错误发生时,暂停执行并向用户询问下一步操作(
Y
-继续,A
-全部继续,H
-挂起,?
-帮助)。 - SilentlyContinue:静默继续,不在屏幕上显示错误信息,但错误仍然会被记录到自动变量
$Error
中。命令继续执行。 - Stop:停止
- Suspend:挂起,此参数仅适用于 PowerShell 工作流 (Workflow)。当错误发生时,工作流会暂停并允许用户调查,然后可以选择恢复或终止。
Try {Get-Content './file.txt' -ErrorAction Stop
} Catch {Write-Error "File can't be found"
}
Throw
抛出
- 如果异常未被任何
Catch
块捕获,最终会显示在控制台上。 - 在
Catch
块中:通过$_
或$PSItem
变量访问。
Catch {$ErrorMessage = $_.Exception.Message # 获取错误信息$ErrorType = $_.Exception.GetType().FullName # 获取错误类型
}
- 自动变量
$Error
:PowerShell 会自动将所有错误记录到全局的$Error
数组中,最新的错误在索引[0]
。即使异常被Catch
处理了,也依然会记录到$Error
中。你可以使用$Error[0] | FL *
查看一个错误的全部详细信息。
案例:
下面这个就是Throw抛出后,因为有catch,且catch将错误信息打印出来了,所以根据catch的错误信息拼接起来打印。
(否则一般情况下,你直接Throw的话,他就是直接打印错误信息在终端上)
Try {If ($Path -eq './forbidden') {Throw "Path not allowed"}# Carry on.} Catch {Write-Error "$($_.exception.message)" # Path not allowed.
}
PowerShell变量、数组和哈希表
变量
通过查看名为“变量”的 PowerShell 驱动器的内容来查看内存中包含的变量,请使用以下命令:
Get-ChildItem Variable:
或者直接使用↓↓,二者一样
Get-Variable
下面显示的变量,有的是你自己在当前session中定义的,有的是系统的。
你所看到的都可以通过添加一个$
符号来打印出来他的值,当你反正你直接打印所有的时候已经是能看到他的值value了
创建变量
简单的创建就是直接$变量名
但是遇到有空格的那就需要添加大括号 { }
${log file}
变量名称不区分大小写, 变量 $USER
和 $user
是可以互换的。
为了提高可读性,常见的约定是使用小写字符,并将变量名称中每个单词的第一个字母大写。
例如,$logFile
和 $LogFile
都是常用的。
但是当变量用于脚本中的参数时,第一个单词应大写,以便与 cmdlet 使用的参数保持一致。
↑↑这个很关键
Param{这里的参数就是建议使用大写第一个字母,因为这个参数变量在实际使用的时候可以tab出来,tab出来的大小写和你这里写的大小写一样,所以建议是使用第一个字母大小写,尽量和其他的cmdlet一致
}
还有一种方法创建变量:
使用此 cmdlet 时,在引用名称时不包括 $
符号,如以下示例所示
Set-Variable -Name num1 -Value 5
变量类型
如果未分配变量类型,Windows PowerShell 会根据赋给变量的值自动分配类型。
类型 | 描述 |
---|---|
String | 字符串变量存储可以包含特殊字符的文本。 例如“This is a string.” |
Int | 32 位整型变量存储不带小数位的数字。 例如 228。 |
Double | 64 位浮点变量存储可包含小数位的数字。 例如 128.45。 |
DateTime | DateTime 变量存储包含日期和时间的日期对象。 例如 2022 年 1 月 5 日上午 10:00。 |
Bool | 布尔变量只能存储值 $true 或 $false 。 |
若想要知道某个变量的类型,可以通过将 GetType() 方法追加到变量名后来查看变量的类型。 例如:
$date.GetType()
变量的方法和属性
1.我们可以利用tab方式来查看,方法是输入变量名并在后面加上一个点,选择“Tab”键时,将显示可用于变量的属性和方法,这样会一个个给你提示出来,你自己慢慢查看即可
2.显示特定变量的所有可用属性和方法
$num1 | Get-Member
字符串变量和方法
字符串变量常用于脚本中。 可以使用字符串来存储用户输入和其他文本数据。 有许多可用于操作字符串的方法。 其中有多种方法很少使用,但最好了解它们以备不时之需。
字符串变量只有一个属性,即“Length”。 查看字符串变量的长度时,它会返回字符串中的字符数。 例如:
$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() | 以字符串形式返回短格式的时间。 |
数组和哈希表
定义数组
数组元素允许类型不一样
通过在逗号分隔的列表中提供多个值来创建数组
例如:
$computers = "LON-DC1","LON-SRV1","LON-SRV2"
$numbers = 228,43,102
还可以使用命令的输出创建数组
例如:
$users = Get-ADUser -Filter *
$files = Get-ChildItem C:
GetType() 方法来验证变量是否为数组,列出的 BaseType 将为 System.Array
$arr=1,2,3,4
$arr.GetType()
可以在准备好将内容放入空数组之前创建空数组。 稍后在脚本中有一个向数组添加项的循环时,这会很有用
例如:
$newUsers = @()
还可以在向变量添加单个值时强制创建数组。 这将创建一个具有单个值的数组,便于以后向其中添加项
例如:
[array]$computers="LON-DC1"
数组的属性和方法获取
这里是为了告诉你,数组和数组元素的属性和方法获取是不同的
- 获取数组中每个项的属性和方法
$arr | Get-Member
- 获取数组的属性和方法(这里不是获取数组元素的东西哈)
Get-Member -InputObject $arr
使用数组列表
每个项目分配一个从 0 开始的索引号
若要显示特定项,请将索引号放在变量名称后面的括号中
以下示例显示数组中存储在变量 $users 中的第一项:
$arr[0]
可以向数组添加新项,新项可以是单个元素也可以是列表,当然也可以是不同类型的数组:
$arr = $arr + $arrtest# 在powershell中也有这种写法
$arr += $arrtest
上述都是说数组而已,他们的类型是 System.Array
,不是数组列表ArrayList
Windows PowerShell 创建的默认数组类型是固定大小的数组。 这意味着,将项添加到数组时,该数组实际上是使用附加项重新创建的。 使用相对较小的数组时,这不是问题。 但是,如果逐个向数组添加数千个项目,则每次重新创建数组都会对性能产生负面影响。 使用固定大小的数组的另一个问题是删除项。 没有简单的方法可从固定大小的数组中删除项。
若要在赋值时创建数组列表,请使用以下语法:
[System.Collections.ArrayList]$computers = "LON-DC1","LON-SVR1","LON-CL1"
若要创建空且已准备好添加项的数组列表,请使用以下语法:
$computers=New-Object System.Collections.ArrayList
使用数组列表时,可以使用方法来添加和删除项:
$computers.Add("LON-SRV2")
$computers.Remove("LON-CL1")
如果要根据索引号从数组列表中删除项,请使用 RemoveAt() 方法。 例如:
$computers.RemoveAt(1)
定义哈希表
哈希表表示与数组类似的概念,因为它存储多个项,但不同于数组使用索引号来确定每项,哈希表使用唯一键来实现这一点。
键是一个字符串,它是项的唯一标识符。 哈希表中的每个键都与值相关联。
使用哈希表来存储 IP 地址和计算机名,如下表所示:
Key | Value |
---|---|
LON-DC1 | 192.168.0.10 |
LON-SRV1 | 192.168.0.11 |
LON-SRV2 | 192.168.0.12 |
如果哈希表名为 $servers
,可以使用以下任意选项访问哈希表中的第一项:
$servers.'LON-DC1'
$servers['LON-DC1']
因为我们的这个Key有特殊符号 -
,所以需要引号包起来,若你的变量就是正常的没有啥特殊字符就可以直接使用而不用引号包裹。
使用哈希表
以下命令创建一个名为 $servers
的哈希表来存储服务器名称和 IP 地址:
# 下面是放在单独的行,所以使用分号隔开
$servers = @{"LON-DC1" = "172.16.0.10"; "LON-SRV1" = "172.16.0.11"}# 下面是每一项都单独一行,所以不用分号隔开
$servers = @{
"LON-DC1" = "172.16.0.10"
"LON-SRV1" = "172.16.0.11"
}
请注意上面的示例中的以下语法:
- 它以 @ 符号开头。
- 键和关联的值括在大括号中。
- 项之间用分号分隔。
更新键的值是直接赋值即可
$servers."LON-SRV2"="172.16.0.100"
查看哈希表可用的所有属性和方法
$servers | Get-Member