PowerShell 技能连载 - 计算一个月的第一天和最后一天
对于报表以及类似的场景,脚本可能需要获得指定月份的第一天和最后一天。第一天很简单,但最后一天依赖于月份和年份。以下是一个简单的计算器。只需要指定您需要的月份和年份:
1 | [ValidateRange(1,12)][int]$month = 3 |
对于报表以及类似的场景,脚本可能需要获得指定月份的第一天和最后一天。第一天很简单,但最后一天依赖于月份和年份。以下是一个简单的计算器。只需要指定您需要的月份和年份:
1 | [ValidateRange(1,12)][int]$month = 3 |
当您拥有一个真正的 DateTime
对象(比如不是字符串)时,您就拥有了许多强大的格式化功能。您可以直接获取一个 DateTime
对象:
1 | PS> $installDate = (Get-CimInstance -Class Win32_OperatingSystem).InstallDate |
或者您可以将一个字符串转换为一个 DateTime
对象:
1 | PS> $psconf = Get-Date -Date '2019-06-04 09:00' |
当您拥有一个 DateTime
对象时,请使用 ToString()
方法并提供一个或两个参数。
第一个参数决定您希望使用日期的哪些部分,并使用这些占位符(大小写敏感!):
y Year
M Month
d Day
H Hour
m Minute
s Second
f Millisecond
指定了越多占位符,就可以得到越多的细节:
1 | PS> (Get-Date).ToString('dd') |
(如您所见,PowerShell 使用的是缺省的语言,这个例子中使用的是德语)
要以 ISO 格式输出一个 DateTime
,请使用这段代码:
1 | PS> $installDate = (Get-CimInstance -Class Win32_OperatingSystem).InstallDate |
如果您也希望指定区域设置(语言),请在第二个参数指定 CultureInfo
:
1 | PS> (Get-Date).ToString('dddd', [System.Globalization.CultureInfo]'en-us') |
如果您想了解某个区域设置的区域代码,请试试这段代码:
1 | PS> [System.Globalization.CultureInfo]::GetCultures('Installed') | Out-GridView -PassThru |
是否关心过您的 Windows 已经安装了多久?一个单行的代码可以告诉您结果:
1 | PS> (Get-CimInstance -Class Win32_OperatingSystem).InstallDate |
有两件事值得注意:第一,我们显然在使用德文的系统。第二,安装的日期可能比您想象的更近:每个新的 Windows 10 主版本更新实际上导致了一个完整的重新安装过程。
如果您希望改变 DateTime
输出的语言,只需要使用 ToString()
和一个 CultureInfo
对象:
1 | PS> (Get-CimInstance -Class Win32_OperatingSystem).InstallDate.ToString([System.Globalization.CultureInfo]'en-us') |
如果您想了解 Windows 安装了多少填,请使用 New-TimeSpan
:
1 | PS> New-TimeSpan -Start (Get-CimInstance -Class Win32_OperatingSystem).InstallDate |
是否厌倦了 OneDrive 图表污染了您的文件管理器树形视图?如果您不使用 OneDrive,那么有两个很好用的函数可以在文件管理器里隐藏或显示 OneDrive 图标:
1 | function Disable-OneDrive |
PowerShell 5 及以上版本提供了一个自动添加 Windows 功能的 cmdlet,所以如果您正在运行 Windows Server 并且想使用 Workstation 功能,请以管理员权限打开一个 PowerShell,然后运行以下代码:
1 | Enable-WindowsOptionalFeature -FeatureName DesktopExperience -All -Online -NoRestart |
XPS 是由 Microsoft 开发的类似 PDF 的文档格式。虽然它并没有大规模使用,但它仍然是一种打印信息到文件的很好的内部格式。要无人值守地打印到 XPS 文件,首先您需要设置一个新的打印机,该打印机将自动打印到一个指定的输出文件:
1 | #requires -RunAsAdministrator |
请确保 XPS 查看器已经安装:
1 | #requires -RunAsAdministrator |
基于以上的准备工作,现在要将输出结果自动打印到 XPS 文件非常简单。以下是一个日常使用的打印函数:
1 | function Out-PrinterXPS ($Path = $(Read-Host -Prompt 'XPS document path to create')) |
让我们试试使用它!以下是一行在桌面上创建系统清单报告的代码:
1 | # print to this file |
BOM(字节顺序标记)是在某些 Unicode 编码的文本文件特有的字节顺序。如果您收到一个包含了 BOM 的文件,而要处理它的其它系统并不支持 BOM,那么以下是如何用 PowerShell 移除这类文件中的 BOM 的方法:
1 | function Remove-BomFromFile ($OldPath, $NewPath) |
现在要获取一个文件的 BOM 并将它转为一个无 BOM 的文件就很方便了:
1 | $Path = "$env:temp\export.csv" |
在前一个技能中我们提供了一个很棒的 PowerShell 速查表。让我们来看看 PowerShell 能够怎样下载这些速查表:
1 | # enable SSL download |
当您运行这段脚本时,PowerShell 将下载所有的速查表并且将它们存放在桌面上一个名为 “CheatSheets” 的新文件夹中。祝您读得愉快!
以下是一个很棒的流行的 PowerShell 速查表,完全免费并且可以直接下载:
https://github.com/PrateekKumarSingh/CheatSheets/tree/master/Powershell
文本文件可以以不同的编码存储。需要正确地指定编码,才能正确地读取它们。这是为什么多数读取文本文件的 cmdlet 提供 -Encoding
参数(例如 Get-Content
)。如果没有指定正确的编码,您可能会看到一堆乱码。
那么如何(自动地)确认某个指定的文本文件所使用的编码?以下是一个好用的函数:
1 | function Get-Encoding |
以下是一段检查您用户配置文件中所有文本文件的测试代码:
1 | PS> dir $home -Filter *.txt -Recurse | Get-Encoding |