PowerShell 技能连载 - 查找 PowerShell 命令

Get-Command 可以帮助您查找给定任务的 PowerShell 命令,但是此 cmdlet 只能搜索命令名称和参数中的关键字。

可以从 PowerShell Gallery 中安装更复杂的搜索命令:

1
Install-Module -Name PSCommandDiscovery -Scope CurrentUser -Verbose

Find-PowerShellCommand 使用关键字并返回与此关键字相关的所有命令。它在命令名称,命令参数以及返回的对象属性中搜索关键字。如果找到的命令类型是已编译的应用程序,则该命令还将返回命令的类型(GUI 或基于控制台的命令)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
PS> Find-PowerShellCommand -Keyword user -CommandType Function,Cmdlet,Application

Command MatchType Member
------- --------- ------
Add-WinADUserGroups CommandName
Get-ComputerInfo Property [string] CsUserName (read/write)
Get-ComputerInfo Property [Nullable`1[[System.UInt32, Syst
Get-ComputerInfo Property [Nullable`1[[System.UInt32, Syst
Get-ComputerInfo Property [string] OsRegisteredUser (read/…
Get-ComputerInfo Property [Nullable`1[[Microsoft.PowerShel
Get-Credential Property [string] UserName (readonly)
Get-Culture Property [bool] UseUserOverride (readonly)
Get-LocalUser CommandName
Get-PnPAADUser CommandName
Get-PnPTeamsUser CommandName
Get-PnPUser CommandName
Get-PnPUserOneDriveQuota CommandName
Get-PnPUserProfileProperty CommandName
Get-Process Property [timespan] UserProcessorTime (re
Get-UICulture Property [bool] UseUserOverride (readonly)
DevModeRunAsUserConfig.msc Command .msc: DevModeRunAsUserConfig (Un
DsmUserTask.exe Command .exe: DsmUserTask (x64) [Gui] 10
quser.exe Command .exe: quser (x64) [Console] 10.0
(...)

MatchType“ 属性报告匹配的种类。可以根据命令名称,参数名称或返回对象的任何属性名称中的关键字匹配找到命令。

有关其他示例,源代码和所有参数的说明,请参见 https://github.com/TobiasPSP/PsCommandDiscovery

PowerShell 技能连载 - 修复 Install-Module (PowerShellGet)

使用 Install-Module ,您可以轻松地从 PowerShell Gallery (www.powershellgallery.com) 下载和安装其他 PowerShell 模块。但是,在 Windows 系统上,此命令可能会中断。许多 Windows 系统仍随附 1.x 版本,并且 PowerShell Gallery 已切换到 Internet 协议 TLS 1.2,较早的 Windows 版本不会自动支持该协议。

要解决 Install-Module 的问题,您应确保 PowerShell 可以使用 TLS 1.2 来访问 PowerShell Gallery:

1
2
3
[System.Net.ServicePointManager]::SecurityProtocol =
[System.Net.ServicePointManager]::SecurityProtocol -bor
[System.Net.SecurityProtocolType]::Tls12

接下来,您应该像这样手动重新安装 PowerShellGet 和 Packagemanagement 模块的当前版本(不需要管理员权限):

1
2
Install-Module -Name PowerShellGet -Scope CurrentUser -Force -AllowClobber
Install-Module -Name Packagemanagement -Scope CurrentUser -Force -AllowClobber

这应该能为大多数用户解决问题。

如果根本无法使用 Install-Module,则可以手动将 PowerShellGet 和 Packagemanagement 的模块文件夹从更新的 Windows 版本复制到另一个版本。运行以下行以查找可以在何处找到最新版本的 PowerShellGet:

1
Get-Module -Name powershellget -ListAvailable | Sort-Object -Property Version -Descending | Select-Object -First 1

最新版本是 2.2.5,并且您不应使用低于 2.x 的版本。如果您的 PowerShell 报告系统上同时存在版本 1.x 和 2.x,则一切正常。PowerShell始终会自动选择最新版本。

PowerShell 技能连载 - 跨平台的 Out-GridView

Out-GridView 是最常用的 cmdlet 之一,它会打开一个通用选择对话框。不幸的是,PowerShell 只能在 Windows 操作系统上显示图形元素,例如窗口。在 Linux 和 macOS 上,图形 cmdlet(例如 Out-GridView)不可用。

您可能想尝试使用新的基于文本的 Out-ConsoleGridView。此 cmdlet 仅适用于PowerShell 7(在Windows PowerShell中不起作用)。像这样安装它:

1
Install-Module -Name Microsoft.PowerShell.ConsoleGuiTools -Scope CurrentUser

安装完成后,在许多情况下,您现在可以轻松地将 Out-GridView 替换为 Out-ConsoleGridView,并享受类似于旧版 Norton Commander 的基于文本的选择对话框。这是旧版 Windows PowerShell 脚本,无法在 Linux 上使用:

1
2
3
4
5
6
Get-Process |
Where-Object MainWindowHandle |
Select-Object -Property Name, Id, Description |
Sort-Object -Property Name |
Out-GridView -Title 'Prozesse' -OutputMode Multiple |
Stop-Process -WhatIf

只需将 Out-GridView 替换为 Out-ConsoleGridView,便一切就绪。

PowerShell 技能连载 - 探索 Windows 上的程序包管理器(第 2 部分)

在上一个技巧中,我们讨论了 “Chocolatey” 程序包管理器,如果您想为所有用户安装软件(需要管理员权限),该程序最有效。

另一个出色的软件包管理器是 “Scoop”,它针对没有管理员权限的普通用户。Scoop 严格为当前用户下载并安装软件,并且是便携式应用程序。

注意:为了能够运行脚本和下载代码,您可能必须先运行以下代码:

1
2
3
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor
[System.Net.SecurityProtocolType]::Tls12
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force

要安装此程序包管理器,请在 PowerShell中运行以下几行(无需管理员权限):

1
2
3
Invoke-RestMethod -UseBasicParsing -Uri 'https://get.scoop.sh' | Invoke-Expression
scoop install git
scoop bucket add extras

安装后,会生成一个名为 “Scoop” 的新命令。

现在,您可以安装可能需要的所有工具。以下几行安装 PowerShell 7、Windows Terminal、7Zip、Notepad ++ 和 Visual Studio Code 编辑器:

1
2
3
4
5
scoop install pwsh
scoop install windows-terminal
scoop install 7zip
scoop install notepadplusplus
scoop install vscode-portable

使用命令 “scoop search [phrase]“,您可以搜索其他可用的安装软件包。

Scoop 将所有软件作为便携式应用程序安装在其自己的文件夹中,您可以这样打开:

1
explorer $home\Scoop\Apps

某些安装包可能会向您的桌面和任务栏添加链接.但是通常您需要访问 scoop 安装文件夹,手动启动应用程序,然后将其固定到任务栏或开始菜单以方便访问。

重要说明:”Scoop” 下载并安装软件包,并尝试解决依赖关系。但是,”Windows Terminal” 之类的某些软件包可能有其他要求(例如Windows Build 1903 或更高版本),因此,如果软件在安装后无法启动,则可能需要检查其他要求。

PowerShell 技能连载 - 探索 Windows 上的程序包管理器(第 1 部分)

在 Linux 世界中,程序包管理器是一种下载和安装软件的既定方法。在 Windows 上,包管理器对于许多人来说仍然是新概念。

如果您是 Windows 系统管理员,并且想为所有用户下载并安装标准软件包,那么 “Chocolatey” 将是首选。该程序包管理器在拥有完全管理员权限的情况下最有效,并使用其默认安装程序包安装软件。

注意:为了能够运行脚本和下载代码,作为先决条件,您可能必须运行以下代码:

1
2
3
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor
[System.Net.SecurityProtocolType]::Tls12
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force

要安装 Chocolatey,请在 PowerShell 中运行以下行:

1
Invoke-RestMethod -UseBasicParsing -Uri 'https://chocolatey.org/install.ps1' | Invoke-Expression

安装成功后,会有一个名为 choco 的新命令,您现在可以使用该命令下载和安装软件。

例如,如果您想为所有用户安装 PowerShell 7,请运行以下命令:

1
choco install powershell-core

PowerShell 技能连载 - 在 Windows 上安装 PowerShell 7 的最简单方法

为 Windows 用户下载和安装 PowerShell 7 的最简单,最灵活的方法可能是运行以下单行代码:

1
Invoke-RestMethod -Uri https://aka.ms/install-powershell.ps1 | New-Item -Path function: -Name Install-PowerShell | Out-Null

它创建了一个拥有许多参数的 cmdlet Install-PowerShell。例如,要将 Windows 7 的最新生产版本作为便携式应用程序下载到您选择的文件夹中,请运行以下命令:

1
Install-PowerShell -Destination c:\ps7test -AddToPath

如果您希望以托管的 MSI 应用程序的形式安装 PowerShell 7,请运行以下命令:

1
Install-PowerShell -UseMSI -Quiet

注意:真正安静的安装需要管理员权限。

PowerShell 技能连载 - 将文本翻译成莫尔斯电码

似乎几乎所有东西都有 Web Service。这是一个将文本转换为摩尔斯电码的 Web Service:

1
2
3
4
5
6
7
8
9
10
11
$Text = 'SOS This is an emergency!'

# URL-encode text
Add-Type -AssemblyName System.Web
$encoded = [System.Web.HttpUtility]::UrlEncode($Text)

# compose web service URL
$Url = "https://api.funtranslations.com/translate/morse.json?text=$encoded"

# call web service
(Invoke-RestMethod -UseBasicParsing -Uri $url).contents.translated

结果看起来像这样:

... --- ...     - .... .. ...     .. ...     .- -.     . -- . .-. --. . -. -.-. -.-- ---.

如果您确实对摩尔斯电码有兴趣,请解析结果文本并创建真正的哔哔声:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$Text = 'Happy New Year 2021!'

# URL-encode text
Add-Type -AssemblyName System.Web
$encoded = [System.Web.HttpUtility]::UrlEncode($Text)

# compose web service URL
$Url = "https://api.funtranslations.com/translate/morse.json?text=$encoded"

# call web service
$morse = (Invoke-RestMethod -UseBasicParsing -Uri $url).contents.translated

Foreach ($char in $morse.ToCharArray())
{
switch ($char)
{
'.' { [Console]::Beep(800, 300) }
'-' { [Console]::Beep(800, 900) }
' ' { Start-Sleep -Milliseconds 500 }
default { Write-Warning "Unknown char: $_"
[Console]::Beep(2000, 500) }

}
Write-Host $char -NoNewline
Start-Sleep -Milliseconds 200
}
Write-Host "OK"

PowerShell 技能连载 - 使用 GitHub Web Service(第 2 部分)

在上一个技能中,我们研究了组织的 GitHub Web 服务 API。现在,让我们看看如何使用单个 GitHub 帐户。

道格·芬克(Doug Finke)创建了一个名为 “ImportExcel” 的出色的开源 PowerShell 模块,该模块使处理 Excel 文件变得轻而易举:https://github.com/dfinke/ImportExcel。他的公共 GitHub 用户名是 dfinke。

要查找他的作品的最新版本以及在何处下载,请尝试以下操作:

1
2
3
4
5
$username = 'dfinke'
$reponame = 'ImportExcel'
$url = "https://api.github.com/repos/$username/$reponame/releases/latest"
Invoke-RestMethod -UseBasicParsing -Uri $url |
Select-Object -Property tag_name, published_at, zipball_url, name

结果看起来像这样:

tag_name published_at         zipball_url
-------- ------------         -----------
v7.1.0   2020-03-21T00:38:13Z https://api.github.com/repos/dfinke/ImportExcel/zipball/v7.1.0

请注意,下载 URL 将下载 GitHub 上所见的整个软件工程。如果您只想使用他的 PowerShell 模块,请选择发布到 PowerShell Gallery 的即用型 PowerShell 模块:

1
PS> Install-Module -Name ImportExcel -Scope CurrentUser

安装模块后,由于 Doug 的出色工作,您现在可以将任何数据通过管道传输到 Export-Excel。如果愿意,请创建包含 Doug 模块完整版本历史记录的 Excel 工作表:

1
2
3
4
5
6
7
8
9
10
11
12
13
$username = 'dfinke'
$reponame = 'ImportExcel'
$url = https://api.github.com/repos/$username/$reponame/releases

Invoke-RestMethod -UseBasicParsing -Uri $url |

# workaround needed for any JSON web service result that
# consists of more than one dataset
ForEach-Object { $_ } |

Sort-Object -Property published_at -Descending |
Select-Object -Property published_at, Name, Url, body |
Export-Excel

PowerShell 技能连载 - 使用 GitHub Web Service(第 1 部分)

如今,GitHub 托管了许多开源软件。这包括诸如 Windows Terminal 或 Visual Studio Code 编辑器之类的强大工具。

GitHub 提供公共 web service 来查询已注册组织(例如 Microsoft)的 repository 详细信息,因此,如果您想了解特定软件是否有新版本,请尝试查询该 web service。

下面的示例查询组织 “Microsoft” 中 “Windows Terminal” repository 的详细信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
PS> $url = 'https://api.github.com/repos/microsoft/terminal/releases/latest'
PS> Invoke-RestMethod -UseBasicParsing -Uri $url


url : https://api.github.com/repos/microsoft/terminal/releases/34250658
assets_url : https://api.github.com/repos/microsoft/terminal/releases/34250658/assets
upload_url : https://uploads.github.com/repos/microsoft/terminal/releases/34250658/asse
ts{?name,label}
html_url : https://github.com/microsoft/terminal/releases/tag/v1.4.3243.0
id : 34250658
author : @{login=DHowett; id=189190; node_id=MDQ6VXNlcjE4OTE5MA==;
avatar_url=https://avatars2.githubusercontent.com/u/189190?v=4;
gravatar_id=; url=https://api.github.com/users/DHowett;
html_url=https://github.com/DHowett;
followers_url=https://api.github.com/users/DHowett/followers; following_ur
l=https://api.github.com/users/DHowett/following{/other_user};
gists_url=https://api.github.com/users/DHowett/gists{/gist_id};
starred_url=https://api.github.com/users/DHowett/starred{/owner}{/repo};
subscriptions_url=https://api.github.com/users/DHowett/subscriptions;
organizations_url=https://api.github.com/users/DHowett/orgs;
repos_url=https://api.github.com/users/DHowett/repos;
events_url=https://api.github.com/users/DHowett/events{/privacy};
received_events_url=https://api.github.com/users/DHowett/received_events;
type=User; site_admin=False}
node_id : MDc6UmVsZWFzZTM0MjUwNjU4
tag_name : v1.4.3243.0
target_commitish : main
name : Windows Terminal v1.4.3243.0
draft : False
prerelease : False
created_at : 2020-11-20T21:34:28Z
published_at : 2020-11-20T21:43:33Z
assets : {@{url=https://api.github.com/repos/microsoft/terminal/releases/assets/285
75927; id=28575927; node_id=MDEyOlJlbGVhc2VBc3NldDI4NTc1OTI3;
name=Microsoft.WindowsTerminal_1.4.3243.0_8wekyb3d8bbwe.msixbundle;
label=; uploader=; content_type=application/octet-stream; state=uploaded;
size=22834909; download_count=28268; created_at=2020-11-20T21:43:26Z;
updated_at=2020-11-20T21:43:28Z; browser_download_url=https://github.com/m
icrosoft/terminal/releases/download/v1.4.3243.0/Microsoft.WindowsTerminal_
1.4.3243.0_8wekyb3d8bbwe.msixbundle}, @{url=https://api.github.com/repos/m
icrosoft/terminal/releases/assets/28575931; id=28575931;
node_id=MDEyOlJlbGVhc2VBc3NldDI4NTc1OTMx; name=Microsoft.WindowsTerminal_1
.4.3243.0_8wekyb3d8bbwe.msixbundle_Windows10_PreinstallKit.zip; label=;
uploader=; content_type=application/zip; state=uploaded; size=22311138;
download_count=5063; created_at=2020-11-20T21:43:31Z;
updated_at=2020-11-20T21:43:32Z; browser_download_url=https://github.com/m
icrosoft/terminal/releases/download/v1.4.3243.0/Microsoft.WindowsTerminal_
1.4.3243.0_8wekyb3d8bbwe.msixbundle_Windows10_PreinstallKit.zip}}
tarball_url : https://api.github.com/repos/microsoft/terminal/tarball/v1.4.3243.0
zipball_url : https://api.github.com/repos/microsoft/terminal/zipball/v1.4.3243.0
body : This is a quick servicing release to address a couple glaring issues in
the 1.4 stable release.

A [preinstallation](https://docs.microsoft.com/en-us/windows/msix/desktop/
deploy-preinstalled-apps) kit is available for system integrators and
OEMs interested in prepackaging Windows Terminal with a Windows image.
More information is available in the [DISM documentation on preinstallatio
n](https://docs.microsoft.com/windows-hardware/manufacture/desktop/preinst
all-apps-using-dism). Users who do not intend to preinstall Windows
Terminal should continue using the _msixbundle_ distribution.

Bugs fixed in this release:

* We reverted the tab switcher to _off by default_, because we changed
your defaults on you so that tab switching was both enabled and _in
most-recently-used order_. I'm sorry about that. (#8325)
* To turn the switcher back on, in MRU order, add the global setting
`"useTabSwitcher": true`.
* We'd previously said the default value for `backgroundImageStretch` was
`uniformToFill`, but it was actually `fill`. We've updated the code to
make it `uniformToFill`. (#8280)
* The tab switcher used to occasionally eat custom key bindings and
break, but @Don-Vito came through and helped it not do that. Thanks!
(#8250)

从这些丰富的信息中,您可以选择需要了解的详细信息,即各种格式的最新下载位置:

1
2
3
4
5
6
7
8
$url = 'https://api.github.com/repos/microsoft/terminal/releases/latest'
$info = Invoke-RestMethod -UseBasicParsing -Uri $url

[PSCustomObject]@{
TAR = $info.tarball_url
ZIP = $info.zipball_url
AppX = $info.Assets.Browser_Download_url[0]
} | Format-List

结果如下:

TAR  : https://api.github.com/repos/microsoft/terminal/tarball/v1.4.3243.0
ZIP  : https://api.github.com/repos/microsoft/terminal/zipball/v1.4.3243.0
AppX : https://github.com/microsoft/terminal/releases/download/v1.4.3243.0/Microsoft.WindowsT
       erminal_1.4.3243.0_8wekyb3d8bbwe.msixbundle

PowerShell 技能连载 - 识别当前时区

显然,您可以这样向您的计算机查询当前时区:

1
2
3
4
5
6
7
8
9
PS> Get-TimeZone


Id : W. Europe Standard Time
DisplayName : (UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
StandardName : W. Europe Standard Time
DaylightName : W. Europe Daylight Time
BaseUtcOffset : 01:00:00
SupportsDaylightSavingTime : True

但是,此信息是否正确取决于您的实际配置。当您将笔记本电脑带到其他地方时,不一定会更新您的时区。

找出当前时区的另一种方法是调用公共 Web 服务。根据您当前的互联网连接,它会根据您当前所在的位置返回时区:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PS> Invoke-RestMethod -Uri 'http://worldtimeapi.org/api/ip'


abbreviation : CET
client_ip : 84.183.236.178
datetime : 2021-01-04T13:31:57.398092+01:00
day_of_week : 1
day_of_year : 4
dst : False
dst_from :
dst_offset : 0
dst_until :
raw_offset : 3600
timezone : Europe/Berlin
unixtime : 1609763517
utc_datetime : 2021-01-04T12:31:57.398092+00:00
utc_offset : +01:00
week_number : 1