PowerShell 技术互动社区发展状况(2023 年 3 月)
至 2023 年 3 月,“PowerShell 技术互动”社区人数已达到 1976 人,十分接近社区最大容量(2000 人),保持 PowerShell 最大中文社区的位置。根据腾讯社交平台的策略,社区人数的上限为 2000 人,我们会尽可能保留机会给活跃用户。
如您遇到 PowerShell 方面的技术问题,或有好的资源希望分享,请加入我们。QQ 群号:271143343。
或者用手机 QQ 扫描二维码:
至 2023 年 3 月,“PowerShell 技术互动”社区人数已达到 1976 人,十分接近社区最大容量(2000 人),保持 PowerShell 最大中文社区的位置。根据腾讯社交平台的策略,社区人数的上限为 2000 人,我们会尽可能保留机会给活跃用户。
如您遇到 PowerShell 方面的技术问题,或有好的资源希望分享,请加入我们。QQ 群号:271143343。
或者用手机 QQ 扫描二维码:
哈希表和字典是完美的查找表:每当您的原始数据包含难以理解的数字或命令返回仅为数值返回值时,哈希表可以将这些数字转换为友好的文本。
由于您可以自由地向哈希表添加任何键,因此要翻译的数字也不必是连续的数字范围。
以下是一个示例,从 WMI 查询操作系统信息,然后将您的 Windows SKU 从数字转换为描述性文本:
1 | # get any info, i.e. some WMI information about your OS |
这个基本的概念适用于所有类型的翻译。以下是一个示例,可以将 ping.exe 提供的返回值进行翻译:
1 | $translation = @{ |
以下是执行结果:
IpAddress Status
--------- ------
192.168.2.1 SUCCESS
192.168.2.2 FAILURE
192.168.2.3 FAILURE
192.168.2.4 FAILURE
192.168.2.5 FAILURE
192.168.2.6 FAILURE
...
在 Windows 上,PowerShell 带有用于自动化内置防病毒引擎 “Defender” 的 cmdlet。在第二部分中,让我们看看如何找出在您的计算机上活动的防病毒设置:
1 | PS C:\> Get-MpPreference |
从结果中可以看到,一些设置是受保护的,需要管理员权限才能查询。
如果您想更改防病毒软件设置,只需使用 Set-MpPreference
命令。
当然,您可以使用 Select-Object
命令过滤返回的信息以回答特定问题,但如果您想根据值过滤信息怎么办?比如说,您需要一份当前关闭的所有功能的列表?
以下是一种聪明的方法,使用底层的 PSObject 列出所有属性的名称,然后根据它们的值进行过滤:
1 | $preference = Get-MpPreference |
同样,下面的代码列出了所有当前已禁用的属性(值为 $false
):
1 | $preference = Get-MpPreference |
由于上述方法可以根据任何属性值进行过滤,因此您可以轻松地调整它,例如只转储包含小于 500 的 [byte]
属性:
1 | $preference = Get-MpPreference |
以下是执行结果:
Name Value
---- -----
CloudBlockLevel 1
DefinitionUpdatesChannel 0
EnableControlledFolderAccess 0
EnableNetworkProtection 0
EngineUpdatesChannel 0
HighThreatDefaultAction 0
LowThreatDefaultAction 0
MAPSReporting 2
ModerateThreatDefaultAction 0
PlatformUpdatesChannel 0
PUAProtection 1
RealTimeScanDirection 0
RemediationScheduleDay 0
ScanAvgCPULoadFactor 50
ScanParameters 1
ScanScheduleDay 0
SevereThreatDefaultAction 0
SignatureScheduleDay 8
SubmitSamplesConsent 1
UnknownThreatDefaultAction 0
现在,我们总结一下:通过将代码封装在函数中,您使代码可以重复使用,自动添加可扩展性(在上面的示例中,我们现在可以在同一个调用中转换一个或数千个字符串),并且您的生产脚本代码变得更短,可以集中精力完成真正想要实现的任务。
1 | PS C:\> Get-Command -Module ConfigDefender |
在 Windows 上,PowerShell 带有用于自动化操作内置防病毒引擎 “Defender” 的 cmdlet。
如果您想自动更新签名,请尝试以下操作:
1 | PS C:\> Update-MpSignature |
如果您在计划任务的脚本中运行此命令,则现在可以完全控制。无需管理员特权。
同样,PowerShell 可以仅使用一个命令随时启动快速扫描:
1 | PS C:\> Start-MpScan -ScanType QuickScan |
扫描进度显示为 PowerShell 进度条,无需打开烦人的对话框。
如果您想知道您最近面临的最新威胁,请让 Defender 输出其威胁分析:
1 | PS C:\> Get-MpThreat |
PowerShell 是一种通用脚本语言,因此您可以使用它来完成各种任务。以下是一个将光波长转换为相应 RGB 颜色值的函数:
1 | function Convert-WavelengthToRgb |
现在,将整个可见光谱转换为相应的 RGB 值就变得简单了:
1 | # Calculate RGB values for the visible light spectrum (wavelengths) |
由于人眼对不同颜色的敏感度不同,该函数甚至可以考虑此敏感度并自动应用校正:
1 | 380..780 | |
在 Windows 上,PowerShell 带有用于自动化操作内置防病毒引擎 “Defender” 的 cmdlet。
如果您想自动更新签名,请尝试以下操作:
1 | PS C:\> Update-MpSignature |
如果您在计划任务的脚本中运行此命令,则现在可以完全控制。无需管理员特权。
同样,PowerShell 可以仅使用一个命令随时启动快速扫描:
1 | PS C:\> Start-MpScan -ScanType QuickScan |
扫描进度显示为 PowerShell 进度条,无需打开烦人的对话框。
如果您想知道您最近面临的最新威胁,请让 Defender 输出其威胁分析:
1 | PS C:\> Get-MpThreat |
假设您的脚本需要敏感输入,例如数据库的连接字符串或其他文本信息。
管理此类机密信息的一种方法是将它们存储为 [SecureString]
,并安全地序列化此信息到 XML。以下是此部分的操作:
1 | $Path = "$env:temp\safeconnectionstring.test" |
它将三段机密信息存储到一个哈希表中,将其转换为安全字符串,然后安全地将它们导出到 XML。机密的关键是运行此脚本的用户和机器,因此只有此人(在同一台计算机上)才能稍后读取信息。
如果您不想将机密信息存储在任何地方,您还可以交互式地输入它们:
1 | $Path = "$env:temp\safeconnectionstring.test" |
Now, when it is time to use the secrets, you need a way to convert secure strings back to plain text. This is what this script does:
现在,当需要使用这些机密信息时,您需要一种将安全字符串转换回纯文本的方法。此脚本的操作:
1 | $hash = Import-Clixml -Path $Path |
结果($hash
)是一个哈希表,其中包含以纯文本形式保存的机密信息,因此在此示例中,您可以通过三个键“con1”、“con2”和“con3”访问这三个机密信息:
1 | PS> $hash.Con1 |
第 1 部分中我们介绍了将数据转换为更适合的 .NET 数据类型后数据的可用性如何提高。
如果无法为数据找到现有的数据类型以为其提供结构,也可以创建自己的数据类型。
假设您需要处理名称。这是一个名为 [TeamMember]
的自定义数据类型,可以为名称添加结构:
1 | class TeamMember |
运行此代码后,定义了名为 [TeamMember]
的新数据类型。现在可以将包含名称的字符串简单地转换为结构化数据类型:
1 | PS> [TeamMember]'tobias weltner' |
还有个额外的好处,即自动纠正大小写,或者说,您的类可以包含任何您喜欢的魔法。当您后来使用该类型时,您不再需要担心它。
更好的是,当将此类型分配给变量时,它将自动将任何名称转换为新结构,即使在以后的赋值中也是如此:
1 | PS> [TeamMember]$name = 'Tobias Weltner' |
自定义类的自动转换的秘密在于其构造函数。当构造函数接受一个 [string]
类型的参数时,它可以自动将任何字符串转换为新结构。
类的构造函数和类名相同,并且输入参数为 [string]
:
1 | TeamMember([string]$Name) |
Windows 是一个 API 驱动的操作系统,而 PowerShell 也是如此。与其他使用纯文本作为基础元素并让用户通过 grep 和正则表达式来结构化数据的 shell 相比,PowerShell(和底层的 .NET 框架)提供了一组丰富的数据类型,您可以从中选择最适合的来完美地存储数据。
默认情况下,PowerShell 仅使用基本数据类型,例如[string]
(文本),[int]
(数字),[double]
(浮点数),[datetime]
(日期和时间)和[bool]
(真和假)。
You however can pick any other data type that you find more suitable:
但是,您可以选择任何其他您认为更合适的数据类型:
1 | PS> [System.IO.FileInfo]'c:\test\somefile.txt' |
通过将通用数据类型(如字符串)转换为更适当的数据类型,访问单个信息变得更加容易。例如,如果您想解析文件路径,通过将字符串转换为[System.Io.FileInfo]
,您可以轻松地拆分路径并提取驱动器、父文件夹、文件名、没有扩展名的文件名或扩展名:
1 | PS> $path = [System.IO.FileInfo]'c:\test\somefile.txt' |