PowerShell 技能连载 - 安装 PowerShell 7
PowerShell 7 是便携式应用程序,可以与 Windows PowerShell 平行运行。您只需要下载并安装它。
这部分很容易,因为 PowerShell 团队提供了自动安装脚本。只需一点技巧,您就可以下载此代码并将其绑定到新的 PowerShell 功能,从而可以非常容易地从现有 Windows PowerShell 安装 PowerShell 7:
1 | # Download installation script |
PowerShell 7 是便携式应用程序,可以与 Windows PowerShell 平行运行。您只需要下载并安装它。
这部分很容易,因为 PowerShell 团队提供了自动安装脚本。只需一点技巧,您就可以下载此代码并将其绑定到新的 PowerShell 功能,从而可以非常容易地从现有 Windows PowerShell 安装 PowerShell 7:
1 | # Download installation script |
在 PowerPoint 演示文稿中使用点击操作对于启动 Visual Studio Code 或 PowerShell ISE 以及无缝打开和演示 PowerShell 代码非常有用。
但是,出于安全原因,默认情况下禁止通过插入的“操作”项启动程序,并且没有启用它的简便方法。而且,即使您确实启用了此功能,PowerPoint 也会在短时间后将其恢复为保护模式。
这是一个快速的 PowerShell脚本,您可以在演示之前立即运行它,以确保所有可点击的“操作”点击后能生效。
1 | $path = 'HKCU:\Software\Microsoft\Office\16.0\PowerPoint\Security' |
当 Windows 检测到存储驱动器有异常,它就会启用自动完整性检查。对于系统分区,在下次启动时,Windows 会显示用户提示,并要求获得执行检查的权限。
要找出启用了这种检查的所有驱动器,请运行以下命令:
1 | PS> Get-CimInstance -ClassName Win32_AutochkSetting | Select-Object -Property SettingID, UserInputDelay |
UserInputDelay 属性指定 Windows 在启动时等待用户提示的秒数。如果届时用户仍未响应,则将自动执行磁盘完整性检查。
WMI 可以更改此设置。如果要将延迟增加到 20 秒,请使用管理员权限运行以下命令:
1 | Set-CimInstance -Query "Select * From Win32_AutochkSetting" -Property @{UserInputDelay=20} |
请注意,此命令为所有受支持的磁盘驱动器设置 UserInputDelay。要仅对选定的驱动器进行设置,请优化提交的查询,然后添加一个过滤器,例如:
1 | Set-CimInstance -Query 'Select * From Win32_AutochkSetting Where SettingID LIKE "%\\Device\\Harddisk0\\Partition3"' -Property @{UserInputDelay=30} |
有关WMI查询的更多信息,请访问 http://powershell.one/wmi/wql。
WMI 可以返回显示适配器可用的显示分辨率列表:
1 | PS> Get-CimInstance -ClassName CIM_VideoControllerResolution | |
WMI 是否可以返回视频模式取决于您的视频适配器和驱动程序。如果没有可用的视频模式,则不返回任何内容。
要检查您的视频适配器,请使用 Win32_VideoController WMI类:
1 | PS> Get-CimInstance -ClassName CIM_VideoController -Property * |
有关这两个类的文档,请访问 http://powershell.one/wmi/root/cimv2/cim_videocontrollerresolution 和 http://powershell.one/wmi/root/cimv2/win32_videocontroller。
以下是在 PowerShell 脚本中经常发现的三个命令,您应该注意这些命令,因为它们可能会产生严重的副作用:
“exit“ 实际上不是命令,而是语言的一部分。它会立即退出PowerShell,您可以选择提交一个数字,该数字将成为调用者可以获取到的 “error level”。
仅当您确实要退出 PowerShell 时才使用 “exit“。不要在旨在由其他人调用的函数或脚本中使用它。您可以试试:在函数下方运行时,它输出“ A”,然后退出。但是,您的 PowerShell 环境也将关闭。
1 | function test |
如果只想“退出”部分代码而不退出整个 PowerShell 环境,请改用 “return“:
1 | function test |
此命令使 PowerShell 的行为更加严格,即当您读取变量或调用实际上不存在的方法时抛出异常。在默认模式下,PowerShell 将仅返回 $null。
对于专业的 PowerShell 用户,在编写脚本代码时启用严格模式是个好主意,因为 PowerShell 会强制您编写更简洁的代码。但是,切勿将此命令添加到生产代码中!
一方面,这没有任何意义:您的生产代码已完成,因此启用严格检查不会改变任何事情。更糟糕的是:您在生产机器上强加了自己的首选项,这可能会导致意外的(和不必要的)异常。假设您的代码调用了其他代码或使用了其他模块中的命令,并且它们的作者使用了 PowerShell 的懒惰模式。现在,当您的代码启用严格模式时,将相同的严格规则应用于从您的代码中调用的所有代码。
即使在测试过程中效果很好,您也不知道其他作者何时更新他们的代码,而导致出现问题。
如果在代码中找到 “Set-StrictMode“ 调用,只需删除它们即可。如果您喜欢严格模式,请改为在您的个人 PowerShell 配置文件中启用它,或者在需要时手动将其启用。
该命令采用任何字符串,并像执行 PowerShell 命令一样执行它。尽管这是非常强大的功能,有时甚至是绝对必要的,但它带来了类似所谓“SQL注入”安全问题的所有风险。请看以下代码:
1 | # get user input |
运行此代码时,系统会要求您提供路径,并在输入例如 “C:\Windows“ 时看到日志文件列表。但是,执行的代码直接取决于用户输入的内容。当您再次运行代码时,请尝试以下操作:$(Get-Service | Out-GridView; c:\Windows)
这次,PowerShell 首先列出所有服务,并将它们输出到网格视图窗口。您使用 “$()“ “注入”了代码。
尽可能避免使用 Invoke-Expression,当然,上面的示例是有意构造的。您可以将用户输入直接提交给适当的命令参数,而不是编写字符串命令:
1 | # get user input |
如果必须使用 Invoke-Expression,请格外小心,验证任何用户输入,并确保用户无法注入代码。
当添加 -PassThru 参数时,Out-GridView 可以用作通用的选择对话框。下面的单行停止了您在网格视图窗口中选择的所有服务(嗯,不是真的停止。在删除 -WhatIf 参数之前,都可以安全地运行):
1 | Get-Service | Out-GridView -Title 'Select Service' -PassThru | Stop-Service -WhatIf |
但是,Out-GridView 中存在一个长期存在的错误:将信息填充到网格视图窗口中时,启用了用于选择项目的按钮,但不返回任何内容。这是一个测试用例:我用 Windows 文件夹中大于 10MB 的所有文件填充网格视图窗口:
1 | Get-ChildItem -Path C:\Windows -Recurse -File -ErrorAction SilentlyContinue | |
枚举文件可能要花费一些时间,由于优雅的实时特性,过一会儿会在网格视图窗口看到列出的文件,并且可以选择一些文件,然后单击右下角的“确定”按钮将其返回到控制台。
注意:如果在所有文件都发送到网格视图窗口之前单击“确定”按钮,则网格视图窗口将关闭但不返回任何内容。为了使确定按钮正常工作,您必须知道网格视图窗口的输出何时完成。
除此以外,您无法知道什么时候结束。您可以稍等片刻,以期获得最好的结果,但是没有任何提示告诉您网格视图窗口已完全填充完毕。
一种解决方法是先将数据存储在变量中,然后将其快速发送到网格视图窗口:
1 | $files = Get-ChildItem -Path C:\Windows -Recurse -File -ErrorAction SilentlyContinue | |
但是,这么做失去了实时性,并且可能需要等待几秒钟才能收集数据并打开网格视图窗口。
一种更聪明的方法是利用 PowerShell 的管道体系结构并使用管道感知功能。完成所有管道处理后,将调用其 “end“ 代码块,因此您可以在此处放置代码以提示所有数据已完成:
1 | function Send-PipelineEndNotification |
只需在 Out-GridView 之前调用 Send-PipelineEndNotification。现在,在控制台中,您会看到一条警告,告知您仍在收集信息,并在网格视图窗口完成并准备返回所选项目时显示绿色的通知文本和提示音。
Win32_LogicalDevice WMI 类代表计算机中可用的所有逻辑设备,通过查询此“超类”,您可以获取所有专用的单个类。这是找出 WMI 可以为您提供哪些信息以及 WMI 类的名称的简单方法:
1 | Get-CimInstance -ClassName CIM_LogicalDevice | |
在网格视图窗口中,选择一个或多个您感兴趣的实例(按住CTRL键选择多个实例),然后将选定的实例转储到控制台。请等待网格视图窗口填充完毕,然后再尝试选择某些内容。
在我的笔记本上,我选择了一个“音频设备”:
Name CreationClassName DeviceID
---- ----------------- --------
Intel(R) Display-Audio Win32_SoundDevice INTELAUDIO\FUNC_01&VEN_8086&DEV_280...
要查找有关它的更多信息,请使用 “CreationClassName“ 中的 WMI 类(即 Win32_SoundDevice)查询特定信息,运行以下命令:
1 | PS> Get-CimInstance -ClassName Win32_SoundDevice |
显然,我的机器中有三个声音设备。要查看所有详细信息,请将数据发送到 Select-Object:
1 | PS> Get-CimInstance -ClassName Win32_SoundDevice | Select-Object * |
并且,如果您想进一步了解此类(或其它类),请访问PowerShell WMI参考:http://powershell.one/wmi/root/cimv2/win32_sounddevice。只需将WMI类名替换为您要使用的类名即可。
Carbon 是 PowerShell Gallery 中最受欢迎的免费 PowerShell 模块之一。它类似于瑞士军刀,具有多种辅助功能。要安装它,请运行以下命令:
1 | PS> Install-Module -Name Carbon -Scope CurrentUser -Force |
显然,该模块的所有者添加了有用的功能。这就是测试您的 PowerShell 当前是否处于提升状态所需的全部操作:
1 | PS> Test-CAdminPrivilege |
要加密或解密字符串,请使用以下命令:
1 | PS> $secret = "Secret Text" | Protect-CString -ForUser |
有很多参数可以通过其他方式进行加密,还有大量命令可以发现。显然,模块作者已将其命令名称前面添加了 “C”,也就是 “Carbon” 的意思,并且包括不带前缀的命令名称的别名。
命令的完整列表非常详尽:
1 | PS> Get-Command -Module Carbon |
在 PowerShell Gallery 中有许多有用的 PowerShell 模块。有一个能帮助您管理更新。要下载和安装它,请运行:
1 | PS> Install-Module -Name PSWindowsUpdate -Scope CurrentUser -Force |
它添加了一系列与 Windows Update 相关的新命令:
1 | PS> Get-Command -Module PSWindowsUpdate |
大多数命令需要提升权限的 shell 才能正常工作,但每个人都可以获得基本信息。
1 | PS> Get-WULastResults |
在前面的技能中,我们研究了完成应用程序路径的复杂的完成代码。收集完成值可能需要一些时间,并且有可能使 IntelliSense 超时。对于不太可能更改的完成值,最好先计算一次,然后再使用缓存的值。
通过这种方式,安装自动完成器可能会占用一两秒时间,但是在那之后就可以享受快速的 IntelliSense:
1 | # define a function without argument completer |
当您运行上面的代码然后使用 Start-Software 或 Start-Process 命令时,您将获得高度响应的 IntelliSense。与内置的完成功能相反,您需要手动按 CTRL + SPACE。