PowerShell 技能连载 - 通过 PowerShell 休眠或待机
在上一个技能中,我们说明了虽然很难直接访问 Windows 电源管理 API,但还有其他 API 可以为您做到这一点。这段代码可让您将 Windows 系统关闭到所需的电源管理状态,即您可以将其休眠并使其进入无能耗状态:
1 | # use the built-in pwmgmt support in Windows Forms |
PowerShell 技能连载 - 通过 PowerShell 休眠或待机
在上一个技能中,我们说明了虽然很难直接访问 Windows 电源管理 API,但还有其他 API 可以为您做到这一点。这段代码可让您将 Windows 系统关闭到所需的电源管理状态,即您可以将其休眠并使其进入无能耗状态:
1 | # use the built-in pwmgmt support in Windows Forms |
虽然很难直接访问 Windows 电源管理 API,但还有其他 API 可以实现相同需求。以下代码返回您机器的当前电源状态。如果您使用的是笔记本电脑并且没有交流电源,它可以告诉您剩余电池电量:
1 | Add-Type -AssemblyName System.Windows.Forms |
结果类似这样:
PowerLineStatus : Offline
BatteryChargeStatus : 0
BatteryFullLifetime : -1
BatteryLifePercent : 0,45
BatteryLifeRemaining : 13498
如果 Windows 崩溃或意外停止,当下次重启时,它会产生一条 ID 为 41 的内核错误日志。如果您想检查回顾您的 Windows 是否正常关闭,请尝试以下代码:
1 | Get-EventLog -Logname System -Source "Microsoft-Windows-Kernel-Power" | |
一种更现代且与 PowerShell 7 兼容的方式是使用 Get-WinEvent,而不是使用过滤器哈希表:
1 | Get-WinEvent -FilterHashtable @{ |
PowerShell 技能连载 - 奇怪的 Cmdlet:New-TemporaryFile
这是一个 PowerShell(和 Windows PowerShell)中比较隐藏的 cmdlet:New-TemporaryFile。看到这样一个相对无用的 cmdlet 成为 PowerShell 的一部分,真是令人惊讶。当你查看它的源代码时,实际上它内部只是调用了一个简单的方法:
1 | # load module that defines the function: |
它的核心是这样的:
1 | PS> [System.IO.Path]::GetTempFileName() |
1 |
|
PowerShell 技能连载 - 本地化日期和时间标签(第 2 部分)
在上一个技能中,我们解释了如何查看所有受支持的 Windows 文化并让 Windows 翻译工作日名称。让我们玩得更开心一些,翻译月份名称。
这是一种特别简单的方法,可以确认您想要使用的文化的简称:
1 | [System.Globalization.CultureInfo]::GetCultures('AllCultures') | |
这将打开一个包含所有支持的文化的网格视图窗口。使用位于其顶部的空文本框来过滤文化,然后选择一个并单击右下角的确定。您需要的是要使用的文化的简称。例如,要使用俄罗斯文化,简称为 “ru”。
现在,在以下调用中替换选定的文化名称:
1 | PS> [System.Globalization.CultureInfo]::GetCultureInfo( 'ru' ).DateTimeFormat.MonthNames |
同样,您可以调整我们之前技巧中的代码来创建两种语言的翻译表:
1 | $english = [System.Globalization.CultureInfo]::GetCultureInfo( 'en' ).DateTimeFormat.MonthNames |
结果类似这样:
Id English Russian
-- ------- -------
1 January Январь
2 February Февраль
3 March Март
4 April Апрель
5 May Май
6 June Июнь
7 July Июль
8 August Август
9 September Сентябрь
10 October Октябрь
11 November Ноябрь
12 December Декабрь
PowerShell 技能连载 - 本地化日期和时间标签(第 1 部分)
Windows 内置了对各种文化的支持。以下是支持的文化列表及其简称:
1 | PS> [System.Globalization.CultureInfo]::GetCultures('AllCultures') | Select-Object -Property Name, DisplayName |
它还带有完全翻译的日期和时间组件表达。如果您想知道 Kikuyu(肯尼亚)中使用的工作日名称,请查找适当的文化名称( “ki”),然后尝试以下操作:
1 | PS> [System.Globalization.CultureInfo]::GetCultureInfo( 'ki' ).DateTimeFormat.DayNames |
你甚至可以为多种语言创建一个“翻译表”,因为你在 DayNames 中看到的是一个带有数字索引的数组:
1 | PS> [System.Globalization.CultureInfo]::GetCultureInfo( 'ki' ).DateTimeFormat.DayNames[0] |
这是一个显示英文和中文日期名称的翻译表:
1 | $english = [System.Globalization.CultureInfo]::GetCultureInfo( 'en' ).DateTimeFormat.DayNames |
结果如下所示:
English Chinese
------- -------
Sunday 星期日
Monday 星期一
Tuesday 星期二
Wednesday 星期三
Thursday 星期四
Friday 星期五
Saturday 星期六
PowerShell 技能连载 - 计算第几周(第 2 部分)
在上一个技能中,我们解释了如何计算给定日期的日历周。如您所见,这取决于文化和日历设置,并且可能因文化而异。
这就是为什么还有 “ISOWeek” 的原因:它遵守 ISO 8601 并且是标准化的。不幸的是,.NET 中的经典 API 并不总是能计算出正确的 ISOWeek。
这就是为什么微软在 .NET Standard(PowerShell 7 使用的可移植 .NET)和 .NET Framework 5 中添加了一个名为 “ISOWeek” 的全新类。
下面这行代码返回任何日期的 ISOWeek(当在 PowerShell 7 中运行时):
1 | PS> [System.Globalization.ISOWeek]::GetWeekOfYear('2022-01-01') |
在 Windows PowerShell 中运行时,同样的代码会返回红色的异常,因为 Windows PowerShell 基于完整的 .NET Framework,而在当前版本中尚不支持此 API。
PowerShell 技能连载 - 计算第几周(第 1 部分)
计算第几周不是一件很容易的事,并且根据文化不同而不同。以下是一个计算任何日期是第几周的方法:
1 | # calculate day of week |
只需确保您按照当地文化调整了日历的周规则和一周的第一天。
前面的示例使用当前的文化日历。如果您想控制文化,请尝试使用这种方法:
1 | $Date = [DateTime]'2022-12-31' |
在这里,您可以使用 $CultureName 来定义要使用的日历的文化名称。
PowerShell 技能连载 - 通过 PowerShell 创建日历电子表格
是否需要计划为您的俱乐部,社区或爱好进行重复的会议吗?当然,有很多在线工具可以帮助您,但如果您想在 Microsoft Excel 中创建日历列表,PowerShell 可以是一个优秀的帮手。
让我们假设您每周三都有一次重复的会议,会议在下午十二点开始,除了每个月的最后一周。
您可以这样使用 PowerShell,而不是将这些日期和时间手动添加到 Excel 表:
1 | # generate calendar for weekly incidents |
此脚本使用了许多有用的技术:
PowerShell 技能连载 - 打开关闭 Windows 的对话框
以下是打开关闭 Windows 对话框的一行代码:
1 | (New-Object -ComObject Shell.Application).ShutdownWindows() |
使用此行代码,它变成了名为 “bye” 的新命令:
1 | function bye { (New-Object -ComObject Shell.Application).ShutdownWindows() } |
如果将此行放在 $profile 中的自动配置文件 (start) 脚本中(可能需要先创建该文件),则完成脚本时,您现在可以简单地输入 “bye” 以关闭您的 Windows 会话。