PowerShell 技能连载 - 星座计算器(又称“Sternzeichen”)
想过自动将日期转换成星座吗?这里有一个非常简单的脚本,可以帮你实现这个功能,支持英文和德文:
1 | param ( |
想过自动将日期转换成星座吗?这里有一个非常简单的脚本,可以帮你实现这个功能,支持英文和德文:
1 | param ( |
这里有一种简单通用的方法,可以将 `DateTime`` 信息转换为你所需的 ISO 字符串数据组件。例如,如果你只需要日期和月份,而不关心年份,可以按照以下方式操作:
1 | PS> (Get-Date).ToString('"0000-"MM-dd') |
(Get-Date)
表示当前日期,但可以替换为任何 `DateTime`` 对象:
1 | PS> $anyDate = Get-Date -Date '2024-12-24 19:22:11' |
假设你需要过去 48 小时内的所有错误和警告,但是从上午 8 点 45 分开始计算。以下是计算方法:
1 | PS> (Get-Date).AddHours(-48).ToString('yyyy-MM-dd "08:45:00"') |
基本上,您可以使用 ToString()
方法,并使用区分大小写的 .NET DateTime 占位符(例如,’yyyy’ 表示以 4位数字显示的年份)来组合所需的日期和时间字符串表示形式,再加上您自己控制的固定文本。请确保将固定文本放在额外引号中。
当你在 Windows 中右键单击任何 PowerShell 脚本时,上下文菜单会出现“使用 PowerShell 运行”的选项。然而,当你选择这个选项时,可能会看到一个 PowerShell 控制台弹出,询问关于“执行策略”的奇怪问题。让我们明确一点:这与你个人的执行策略设置无关,这些通常控制着 PowerShell 脚本是否可以运行。
相反,上下文菜单命令运行它自己的代码。你可以在 Windows 注册表中查找:
1 | $path = 'HKEY_CLASSES_ROOT\SystemFileAssociations\.ps1\Shell\0\Command' |
而这就是每当您调用它时上下文菜单命令运行的内容:
1 | if((Get-ExecutionPolicy ) -ne 'AllSigned') |
所以基本上,除非你使用的是超严格的执行策略 “AllSigned
“(几乎没有人这样做),否则执行策略会在临时情况下(仅限于此次调用)设置为 “Bypass
“,以允许你运行右键单击的脚本文件。实际上,执行策略会稍微放宽一些,使得即使在未定义明确的执行策略的系统上也可以使用上下文菜单命令。
然而,Set-ExecutionPolicy
有向用户询问回复的倾向,在这里可能会导致烦人的提示框出现。用户真的不想每次使用此上下文菜单命令启动某个脚本时都被问到“确定吗?”
要解决这个问题,只需调整所述注册表键中的代码。在调用 Set-ExecutionPolicy
时添加 “-Force
“ 参数,这样该 cmdlet 就能够进行调整而无需提问。
在之前的部分中,我们回顾了不同的文件类型以持久化数据,并了解了用于读写这些文件的 cmdlets。
今天,让我们将这些知识应用到一个真实的数据文件中,你可以自己创建它(前提是你拥有一台带有 Windows 系统的笔记本电脑,并带有电池供电)。
1 | $Path = "$env:temp\battery.xml" |
运行这行代码后,它会生成一个包含所有电池信息的XML文件,包括设计容量和实际容量,这样你就可以查看电池的状态是否良好。从前面的代码示例中选择适当的代码,读取XML文件的内容:
1 | # path to XML file: |
接下来,在您喜爱的编辑器中,通过在$xml中添加“.”来探索XML的对象结构,并查看 IntelliSense 或通过简单地输出变量来查看,这样 PowerShell 会打印下一个级别的属性名称。
通过这种方式,我找到了电池容量信息:
1 | PS> $xml |
现在我们可以将所有部分组合成一个脚本,返回面向对象的电池磨损信息(确保您的系统有电池,否则会出现红色异常):
1 | # temp path to XML file: |
只需非常少的努力,相同的内容可以成为一个有用的新命令。
1 | function Get-BatteryCapacity |
现在轻松检查电池磨损:
1 | PS> Get-BatteryCapacity | Select-Object Id, Manufacturer, FullChargeCapacity, DesignCapacity |
使用哈希表,Select-Object
现在甚至可以计算剩余电池容量的百分比(但这是我们今天不会深入探讨的另一个话题):
1 | PS> Get-BatteryCapacity | Select-Object Id, Manufacturer, FullChargeCapacity, @{N='Remain';E={'{0:P}' -f ($_.FullChargeCapacity/$_.DesignCapacity)}} |
PowerShell 支持多种文本文件格式,那么保存和读取数据的最佳方法是什么呢?
在本系列的前两部分中,我们提供了一个实用的指南,帮助您根据数据的性质选择最佳文件格式(和适当的 cmdlet)。
当您决定使用 XML 作为数据格式时,您会发现内置的 Export/Import-CliXml
cmdlet 是将 您自己的对象 保存到 XML 文件和反向操作的简单方法。但是如果您需要处理来自您自己未创建的源的 XML 数据,该怎么办呢?让我们来看一下名为“Xml”的 cmdlet:ConvertTo-Xml
。它可以将任何对象转换为 XML 格式:
1 | PS> Get-Process -Id $pid | ConvertTo-Xml |
结果是XML,只有在将其存储在变量中时才有意义,这样您可以检查XML对象并输出XML字符串表示:
1 | PS> $xml = Get-Process -Id $pid | ConvertTo-Xml |
虽然没有 Export-Xml
的命令,但你可以轻松地创建自己的 Export-CliXml
,将对象持久化到文件中,而无需使用专有的“CliXml”结构。
1 | # data to be persisted in XML: |
要走相反的路线,将XML转换回对象,没有 ConvertFrom-Xml`` - 因为这个功能已经内置在类型
[Xml]` 中。要将上面的示例文件转换回对象,您可以执行以下操作(假设您使用上面的示例代码创建了result.xml文件):
1 | # path to XML file: |
这段代码可以读取(任何)XML文件并将XML转换为对象。你可以使用这个模板来读取和处理几乎任何XML文件。
话虽如此,要使用这些数据,你需要了解它的内部结构。在我们的示例中,我们”序列化”了10个进程对象。结果发现,Convert-Xml
通过描述所有属性来保存这些对象。上面的代码演示了如何首先获取序列化对象(在 .Objects.Object` 中找到),然后如何读取属性信息(在
.Property` 中作为对象数组,每个属性一个对象)。
在Powershell中,管道是一个简单但有效的概念之一。在本教程中,我们将学习如何正确使用管道,并使我们的脚本在Powershell中整洁。
Windows Powershell通过管道运行命令。我们看到的每个命令行都是一个管道。一个管道可以包含一个或多个命令,多个命令用竖线字符“|”分隔。
命令从左到右执行,每个命令的输出被传送或传递给其后面的命令。管道中最后一个命令的输出就是显示在屏幕上的内容。
1 | Get-Service #it is a single commad pipeline |
Get-Service |out-file servicelist.txt 没有显示任何输出,你知道为什么吗?
嗯,它会直接将输出存储到管道后面提到的文本文件中。如果你理解了这一点,那么你就走在正确的道路上。
您必须已经理解了流水线的概念。现在让我们看看如何使用 select-object, sort-object, 和 measure-object 结合流水线。让我们通过一些示例来看看如何使用上述管道。
根据属性对对象进行排序
Sort-Object 可以重新对管道中的对象进行排序。
1 | Get-Service | Sort-Object Name Descending |
类似地,您可以尝试在上面尝试 Ascending 并查看输出结果。
根据属性测量对象
Measure-Object 可以测量管道中的对象。我们需要添加 -Property 来指定单个数值属性。 在 -Property 后面,我们可以添加以下内容:
输出将是一个可度量或测量的对象而不是我们传入的任何东西。 让我们来检查一下您可以在自己电脑上尝试的几个示例。
1 | Get-Service | Measure-Object |
选择对象的子集
Select-object
完全没有智能,正如其名称所示,它用于选择。让我们看看它实际上在哪些地方使用以及如何在脚本中使用。
以下是可与 Select-Object 一起使用的一些参数。
我们无法指定任何选择特定行的标准。让我们看看可以尝试在计算机上运行的一些示例。
1 | Get-Service | select-object -first 10 |
这是使用 Select-Object 或 Select 的一种方式,让我们看看另一种可以使用 Select-object 的方法。
1 | get-service |select-object -property Name -first 10 |
在上面的示例中,我们正在选择一个特定属性即已选取了 Name 并且还选取了前十个结果。同样地,我们可以尝试其他示例。
在本教程中,我们了解了 Powershell 中管道是什么、为什么要使用它以及如何使用它。 我们还学习了如何选择、排序和测量对象以及可以将其与示例结合应用的位置。 您可以尝试每个示例并确保您的计算机安装有 Powershell 。 让我们很快见到您,并希望您从今天学到了点东西。
PowerShell支持各种文本文件格式,那么保存和读取数据的最佳方法是什么呢?
这主要取决于数据的类型,下面是实际指南的第一部分:
Get-Content
用于读取,Set-Content
用于写入,Add-Content
用于追加。纯文本文件存储字符串数组。注意事项:在保存和读取时,需要使用相同的文本编码,因此最好使用 UTF-8 编码。注意事项#2:如果您想将字符串数组文件内容读取到变量中,添加 -ReadCount 0
参数。这比默认方式快很多倍。Export-Csv
,Import-Csv
。CSV 文件存储对象数组。CSV 列名定义了对象属性。注意事项:由于 CSV 基于文本,请确保主动选择良好的文本编码,如 UTF-8。注意事项#2:CSV 文件可以使用许多不同的分隔符,因此要么使用 -Delimiter 来始终定义分隔符,要么使用-UseCulture
,如果您希望自动选择的分隔符与其他应用程序在同一系统上匹配,例如,当您计划稍后在 Microsoft Excel 中打开 CSV 文件时。最近,Foreach 和 Foreach-object 成为讨论的焦点,我们对此有所了解。循环是任何代码或脚本的核心,我们必须确保正确执行。但你是否想过哪种更适合在多台服务器上运行特定代码呢?让我们在这篇文章中探讨一下,并获取一些有用的知识。
当选择 invoke-command 和 where { } 时,Foreach 是其中一个备受关注的选项。
拥有 foreach 的优势在于可以将值存储在 Excel 中的一个字符串中,这是一个福音。同样,在选择 foreach () 时,我们有两个不同的选项,一个是 foreach 本身,另一个是 foreach-object。但当你看到对象时它们看起来很相似对吧。
我进行了测试以便能够挑选出胜者。
ForEach-Object 在通过管道发送数据时效果最佳,因为它会继续将对象流式传输到管道中的下一条命令中去。
以下是测试代码:这将测试循环完成所需的实际时间。
1 | $a=Get-ChildItem –File C:\users\dhrub\ -Recurse |
输出一定会让你大吃一惊!
ForEach 语句在处理每个项目之前将所有项目提前加载到集合中。
ForEach-Object 预期通过管道流式传输项目,从而降低内存需求,但同时会影响性能。
Forach 总是比 Foreach-Object 更快,但这并不意味着你不能使用 **Foreach-Object。具体取决于工作的要求。
PowerShellGet 是一个模块,包含重要的 cmdlet,比如 Install-Module
,因此该模块实际上是下载和安装其他模块的先决条件,即从 powershellgallery.com 下载和安装模块的先决条件。
终于,期待已久的第 3 版该模块作为预览版在 PowerShell Gallery 中可用,有很多理由说明你应该使用这个新版本。
以下是安装步骤:
1 | PS> Install-Module -Name PowerShellGet -AllowPrerelease -Scope CurrentUser |
你应该更新的一个原因是,你可能再也无法这样做了。很可能你的 Install-Module
cmdlet 缺少 -AllowPrerelease
参数,因此无法安装任何预发布模块。对于任何使用语义版本的现代模块都是如此。
悲伤的事实是,PowerShellGet 在 Windows 10/11 映像中的初始版本 1.0.0.1 中被包含进去,并且从那时起从未自动更新。版本 1.0.0.1 现在已经过时,无法在许多情况下正常工作。
为了解决这个问题,你应该先手动强制安装 PowerShellGet 2.x。这将安装你安装 PowerShellGet 3.x 所需的先决条件:
1 | PS> Install-Module -Name PowerShellGet -Scope CurrentUser -Force -AllowClobber |
运行这行命令并重新启动 PowerShell 后,Install-Module
应该具有 -AllowPrelease
参数,因此现在你可以运行第一个代码行并安装 PowerShellGet 3.x。
最终,PowerShellGet 3 版将希望解决所有这些问题,并为 PowerShell 的模块交换机制提供更强大的支持。
微软几年前发布了一个模块(最近 3 周更新),您可以使用该模块来检测您的硬件是否容易受到 Spectre 和 Meltdown 威胁的攻击。要尝试这个功能,请从 PowerShell Gallery 安装该模块:
1 | Install-Module -Name SpeculationControl -Scope CurrentUser |
要运行测试套件并查看结果,请输入以下命令:
1 | PS> Get-SpeculationControlSettings |
这将显示您的计算机的测试结果,可能类似于以下内容:
For more information about the output below, please refer to https://support.microsoft.com/help/4074629
Speculation control settings for CVE-2017-5715 [branch target injection]
Hardware support for branch target injection mitigation is present: True
Windows OS support for branch target injection mitigation is present: True
Windows OS support for branch target injection mitigation is enabled: True
Speculation control settings for CVE-2017-5754 [rogue data cache load]
Hardware is vulnerable to rogue data cache load: False
Hardware requires kernel VA shadowing: False
Speculation control settings for CVE-2018-3639 [speculative store bypass]
Hardware is vulnerable to speculative store bypass: True
Hardware support for speculative store bypass disable is present: True
Windows OS support for speculative store bypass disable is present: True
Windows OS support for speculative store bypass disable is enabled system-wide: False
Speculation control settings for CVE-2018-3620 [L1 terminal fault]
Hardware is vulnerable to L1 terminal fault: False
Speculation control settings for MDS [microarchitectural data sampling]
Windows OS support for MDS mitigation is present: True
Hardware is vulnerable to MDS: False
Speculation control settings for SBDR [shared buffers data read]
Windows OS support for SBDR mitigation is present: True
Hardware is vulnerable to SBDR: True
Windows OS support for SBDR mitigation is enabled: False
Speculation control settings for FBSDP [fill buffer stale data propagator]
Windows OS support for FBSDP mitigation is present: True
Hardware is vulnerable to FBSDP: True
Windows OS support for FBSDP mitigation is enabled: False
Speculation control settings for PSDP [primary stale data propagator]
Windows OS support for PSDP mitigation is present: True
Hardware is vulnerable to PSDP: True
Windows OS support for PSDP mitigation is enabled: False
Suggested actions
* Follow the guidance for enabling Windows Client support for speculation control
mitigations described in https://support.microsoft.com/help/4073119
BTIHardwarePresent : True
BTIWindowsSupportPresent : True
BTIWindowsSupportEnabled : True
BTIDisabledBySystemPolicy : False
BTIDisabledByNoHardwareSupport : False
BTIKernelRetpolineEnabled : False
BTIKernelImportOptimizationEnabled : True
RdclHardwareProtectedReported : True
RdclHardwareProtected : True
KVAShadowRequired : False
KVAShadowWindowsSupportPresent : True
KVAShadowWindowsSupportEnabled : False
KVAShadowPcidEnabled : False
SSBDWindowsSupportPresent : True
SSBDHardwareVulnerable : True
SSBDHardwarePresent : True
SSBDWindowsSupportEnabledSystemWide : False
L1TFHardwareVulnerable : False
L1TFWindowsSupportPresent : True
L1TFWindowsSupportEnabled : False
L1TFInvalidPteBit : 0
L1DFlushSupported : True
HvL1tfStatusAvailable : True
HvL1tfProcessorNotAffected : True
MDSWindowsSupportPresent : True
MDSHardwareVulnerable : False
MDSWindowsSupportEnabled : False
FBClearWindowsSupportPresent : True
SBDRSSDPHardwareVulnerable : True
FBSDPHardwareVulnerable : True
PSDPHardwareVulnerable : True
FBClearWindowsSupportEnabled : False
PS>