以下是一个针对有德语技能的用户的特殊服务——对于其他人修改代码会有所挑战:以下代码使用了德国主要新闻杂志的 RSS 订阅,打开一个选择窗口。在窗口中您可以选择一篇或多篇文章,然后在缺省的浏览器中打开选择的文章:
1 | # URL to RSS Feed |
基本的设计过程是一致的:要将代码改为另一个 RSS 订阅,只需要导航到相应的属性(背后的 XML 的嵌套结构)。
以下是一个针对有德语技能的用户的特殊服务——对于其他人修改代码会有所挑战:以下代码使用了德国主要新闻杂志的 RSS 订阅,打开一个选择窗口。在窗口中您可以选择一篇或多篇文章,然后在缺省的浏览器中打开选择的文章:
1 | # URL to RSS Feed |
基本的设计过程是一致的:要将代码改为另一个 RSS 订阅,只需要导航到相应的属性(背后的 XML 的嵌套结构)。
PowerShell 技能连载 - 在资源管理器中启用预览 PowerShell 文件
当您在 Windows 的资源管理器中打开预览窗格查看 PowerShell 脚本时,缺省情况下看不到脚本文件的代码预览。预览窗格是空白的。
要启用预览,只需要使用以下函数:
1 | function Enable-PowerShellFilePreview |
运行这个函数后,使用这个命令:
1 | PS> Enable-PowerShellFilePreview |
如果您喜欢的话,还可以改变预览的字体系列和字号。请注意该设置和记事本共享:
1 | PS> Enable-PowerShellFilePreview -Font Consolas -FontSize 100 |
不需要重启系统就可以生效。只需要确保 Windows 资源管理器的预览窗格可见,并选取一个 PowerShell 文件。
PowerShell 技能连载 - 移除空的数组元素(第 2 部分)
如果您想彻底移除空的数组元素(而不需要关心任何空属性),以下是一些性能根本不同的几种实现:
1 | # create huge array with empty elements |
PowerShell 技能连载 - 移除空的数组元素(第 1 部分)
有些时候您会遇到包含空元素的列表(数组)。那么移除空元素的最佳方法是?
让我们首先关注一个普遍的场景:以下代码从注册表读取已安装的软件并创建一个软件清单。该软件清单将显示在一个网格视图窗口中,而很可能能看到包含空属性的元素:
1 | $Paths = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*', |
让我们忽略所有显示名称为空的元素:
1 | # remove elements with empty DisplayName property |
由于空属性既包含“真正”为空 ($null) 也包含空字符串 (''),您需要检查它们两者。更简单的方法是将它们隐式转换为 Boolean。然而,这样做仍然会移除数值 0:
1 | # remove elements with empty DisplayName property |
使用 PowerShell 3 引入的简化语法,您甚至可以这样写:
1 | # remove elements with empty DisplayName property |
如果你想节省几毫秒,请使用 where 方法:
1 | # remove elements with empty DisplayName property |
如果您想处理一个大数组,用 foreach 循环更有效(效率提升 15 倍):
1 | # remove elements with empty DisplayName property |
假设您希望排除某个数组中所有为空字符串或者 null 元素。以下是许多人可能的做法:
1 | PS> 1,2,$null,"test","",9 | Where-Object { $_ -ne '' -and $_ -ne $null } |
然而,这个对比是危险的,因为它也排除了数值 0:
1 | PS> 1,2,0,$null,"test","",0,9 | Where-Object { $_ -ne '' -and $_ -ne $null } |
PowerShell 过滤掉了数值 0,因为它等同于一个空字符串:
1 | PS> 0 -eq '' |
这是因为在比较时,以等号左侧的数据类型为准,而由于左侧是一个 integer 值,所以 PowerShell 将空字符串也转换成一个 integer,而转换的结果值是 0。
为了安全地进行比较,请记住一定将相关的数据类型放在等号左侧,而不是右侧:
1 | PS> 1,2,0,$null,"test","",0,9 | Where-Object { '' -ne $_ -and $null -ne $_ } |
或者更好一点,使用 API 函数来确认空值:
1 | PS> 1,2,0,$null,"test","",0,9 | Where-Object { ![string]::IsNullOrWhiteSpace($_) } |
PowerShell 技能连载 - 计算一个月的第一天和最后一天
对于报表以及类似的场景,脚本可能需要获得指定月份的第一天和最后一天。第一天很简单,但最后一天依赖于月份和年份。以下是一个简单的计算器。只需要指定您需要的月份和年份:
1 | [ValidateRange(1,12)][int]$month = 3 |
PowerShell 技能连载 - 格式化 DateTime
当您拥有一个真正的 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 |
PowerShell 技能连载 - 解析 Windows 安装日期
是否关心过您的 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 |
PowerShell 技能连载 - 在文件管理器中隐藏 OneDrive
是否厌倦了 OneDrive 图表污染了您的文件管理器树形视图?如果您不使用 OneDrive,那么有两个很好用的函数可以在文件管理器里隐藏或显示 OneDrive 图标:
1 | function Disable-OneDrive |
PowerShell 技能连载 - 将 Windows 服务器转变为工作站
PowerShell 5 及以上版本提供了一个自动添加 Windows 功能的 cmdlet,所以如果您正在运行 Windows Server 并且想使用 Workstation 功能,请以管理员权限打开一个 PowerShell,然后运行以下代码:
1 | Enable-WindowsOptionalFeature -FeatureName DesktopExperience -All -Online -NoRestart |