PowerShell的最佳管理能手
如果你看了上一篇关于微软的新一代Windows套件包管理器(OneGet)的文章的话,应该对PowerShell如何操作Windows的套件包管理器有了一定的了解。而这篇内容我会着重要谈谈管理PowerShell的PowerShellGet套件包,他与Windows套件包管理器(OneGet)有着密不可分的关系。PowerShellGet的内容还是比较多的,考虑到篇幅我打算拆分几篇文章分别以介绍,使用等角度来分享下这个PowerShell管理能手。
什么是PowerShellGet
首先,PowerShellGet是可以用来查找,安装,更新,管理等操作PowerShell模块与脚本的一个套件包,也就是所谓的管理PowerShell的包管理器。PowerShellGet里内置了一系列用于管理PowerShell模块与脚本的相关命令。用户可以使用PowerShellGet内的相关命令获取在线的PowerShell模块和脚本。
而PowerShellGet作为与用户的交互接口会默认连接PowerShell Gallery站点并从那获取在线资源。
让我们来看看上一篇我们在OneGet文章中提到的架构图,PowerShellGet作为PackageManagementProviders提供给用户各类相关功能命令使用,而他的Package Source数据源来自于PowerShell Gallery。
还记得我们文章开头提到PowerShellGet与OneGet有着密不可分的关系吗,我们知道OneGet是用来统一管理Windows平台上各种各样的套件包的组件,而OneGet还支持各种Provider扩展他把各种套件提供者Provider组合在一起供用户使用。而PowerShellGet作为一个Provider扩展套件被集成在OneGet中,可以被用于管理PowerShell。
我们用命令查看下PackageManagement的Provider,发现是PowerShellGet。这下你应该明白了,PowerShellGet作为一个Provider扩展套件被集成在OneGet中。
1
2
3
4
5
6
7
|
PS C:\Users\Administrator> Get-Package -Name PackageManagement | Format-List
PropertyOfSoftwareIdentity : PropertyOfSoftwareIdentity
FastPackageReference : NuGet|PackageManagement|1.1.3.0|https://www.powershellgallery.com/api/v2/|Module
ProviderName : PowerShellGet
Source : https://www.powershellgallery.com/api/v2/
Status : Installed
|
用PowerShellGet管理你的模块包
上一篇在PowerShellGet系列中【PowerShellGet系列(一):PowerShell的最佳管理能手】文章中,我们介绍了有关什么是PowerShellGet,今天这篇我们就来看看如何操作PowerShellGet模块里的命令。
不过在正式介绍里面的相关命令操作时,先让我们来简单回顾一下什么是PowerShellGet。
PowerShellGet是可以用来查找,安装,更新,管理等操作PowerShell模块与脚本的一个套件包,也就是所谓的管理PowerShell的包管理器。PowerShellGet里内置了一系列用于管理PowerShell模块与脚本的相关命令。用户可以使用PowerShellGet内的相关命令获取在线的PowerShell模块和脚本。
大家知道了什么是PowerShellGet,按照上面解释的说法,那是不是说明它里面所包含的Cmdlets就是各种操作的相关命令。让我使用Get-Command -Module PowerShellGet命令行来查看下里面包含的命令。
友好提示:文章里的一些代码片段单行内容比较长,如果排版有些拥挤,建议手机切换成横屏模式游览会舒服很多。
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
|
PS C:\Users\Administrator> Get-Command -Module PowerShellGet
CommandType Name Version Source
----------- ---- ------- ------
Function Find-Command 1.0.0.1 PowerShellGet
Function Find-DscResource 1.0.0.1 PowerShellGet
Function Find-Module 1.0.0.1 PowerShellGet
Function Find-RoleCapability 1.0.0.1 PowerShellGet
Function Find-Script 1.0.0.1 PowerShellGet
Function Get-InstalledModule 1.0.0.1 PowerShellGet
Function Get-InstalledScript 1.0.0.1 PowerShellGet
Function Get-PSRepository 1.0.0.1 PowerShellGet
Function Install-Module 1.0.0.1 PowerShellGet
Function Install-Script 1.0.0.1 PowerShellGet
Function New-ScriptFileInfo 1.0.0.1 PowerShellGet
Function Publish-Module 1.0.0.1 PowerShellGet
Function Publish-Script 1.0.0.1 PowerShellGet
Function Register-PSRepository 1.0.0.1 PowerShellGet
Function Save-Module 1.0.0.1 PowerShellGet
Function Save-Script 1.0.0.1 PowerShellGet
Function Set-PSRepository 1.0.0.1 PowerShellGet
Function Test-ScriptFileInfo 1.0.0.1 PowerShellGet
Function Uninstall-Module 1.0.0.1 PowerShellGet
Function Uninstall-Script 1.0.0.1 PowerShellGet
Function Unregister-PSRepository 1.0.0.1 PowerShellGet
Function Update-Module 1.0.0.1 PowerShellGet
Function Update-ModuleManifest 1.0.0.1 PowerShellGet
Function Update-Script 1.0.0.1 PowerShellGet
Function Update-ScriptFileInfo 1.0.0.1 PowerShellGet
|
我们获得了各类用于管理的相关命令,为了方便查看我们用下面的命令做些编排以方便梳理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
PS C:\Users\Administrator> Get-Command -Module PowerShellGet | Group-Object -Property Verb
Count Name Group
----- ---- -----
5 Find {Find-Command, Find-DscResource, Find-Module, Find-RoleCapability...}
3 Get {Get-InstalledModule, Get-InstalledScript, Get-PSRepository}
2 Install {Install-Module, Install-Script}
1 New {New-ScriptFileInfo}
2 Publish {Publish-Module, Publish-Script}
1 Register {Register-PSRepository}
2 Save {Save-Module, Save-Script}
1 Set {Set-PSRepository}
1 Test {Test-ScriptFileInfo}
2 Uninstall {Uninstall-Module, Uninstall-Script}
1 Unregister {Unregister-PSRepository}
4 Update {Update-Module, Update-ModuleManifest, Update-Script, Update-ScriptFileInfo}
|
大家可以看到,有Find(查找), Get(获取), Install(安装), New(新建), Publish(发布), Register(注册), Save(保存), Set(设置), Test(检查), Uninstall(卸载), Unregister(注销), Update(更新)一共包含了12大类的功能管理,几乎你可以用PowerShellGet来管理你整个PowerShell了。因为里面涵盖的内容非常多,所以我打算抽其中部分方面来介绍下。
好吧,我突然想到想用Find-Module查看PowerShellGet的所有包含版本号,因为PowerShellGet的数据源是PSGallery在线站点,所以它会连接PSGallery在线站点去获取我们的数据包,下面列出了目前站点上收录的可用版本号。
1
2
3
4
5
6
7
|
PS C:\Users\Administrator> Find-Module -Name PowerShellGet -AllVersions
Version Name Repository Description
------- ---- ---------- -----------
1.1.2.0 PowerShellGet PSGallery PowerShell module with commands for discovering,..
1.1.1.0 PowerShellGet PSGallery PowerShell module with commands for discovering,..
1.1.0.0 PowerShellGet PSGallery PowerShell module with commands for discovering,..
|
我好像记得我当前电脑里的PowerShellGet不是最新的呢,让我用Get-Module查看下PowerShellGet版本号确认下吧。
1
2
3
4
5
|
PS C:\Users\Administrator> Get-Module -Name PowerShellGet
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 1.0.0.1 PowerShellGet {Find-Command, Find-DscResource, Find-Module, Find-RoleCap..
|
果然不是最新的,我电脑里的版本还是1.0.0.1,而之前我用Find-Module列出的在线版本号最新的已经到1.1.2.0了,赶紧升级下看看是不是又多了什么新功能。怎么升级呢?我想到了Update-Module的命令
1
2
3
4
5
6
7
8
|
PS C:\Users\Administrator> Update-Module -Name PowerShellGet -RequiredVersion 1.1.2.0
Update-Module : Module 'PowerShellGet' was not installed by using Install-Module, so it cannot be updated.
At line:1 char:1
+ Update-Module -Name PowerShellGet -RequiredVersion 1.1.2.0
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (PowerShellGet:String) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : ModuleNotInstalledUsingInstallModuleCmdlet,Update-Module
|
什么情况?居然报错了,提示Module ‘PowerShellGet’ was not installed by using Install-Module, so it cannot be updated. 这段错误提示告诉我,我要升级的PowerShellGet模块并没有通过Install-Module来安装(由于我们目前自带的PowerShellGet是安装WMF 5.0时自带的),所以不能被升级,也就是只有通过Install-Module方式来安装的模块才可以配合Update-Module更新。为了验证下,我用Get-InstalledModule命令查看下,果真下面列出的安装模块列表里显示我之前没用Install-Module方式安装过PowerShellGet模块。
1
2
3
4
5
6
7
8
|
PS C:\Users\Administrator> Get-InstalledModule
Version Name Repository Description
------- ---- ---------- -----------
0.1.0.1 AppxGet PSGallery Powershell Package Management (OneGet) Provider ...
1.5.1 AzureRM PSGallery Azure Resource Manager Module
0.5 GitHubProvider PSGallery GitHub-as-a-Package - PackageManagement PowerShe...
1.1.3.0 PackageManagement PSGallery PackageManagement (a.k.a. OneGet) is a new way t...
|
既然知道原因了那就简单了,马上用Install-Module安装吧。
1
2
3
4
5
6
7
|
PS C:\Users\Administrator> Install-Module -Name PowerShellGet -RequiredVersion 1.1.2.0
Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its
InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from
'PSGallery'?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): N
|
咦,这又什么情况?提示You are installing the modules from an untrusted repository. 我正要安装的模块包来自于一个未被信任的仓库来源。虽然我们输入 “Y” 参数可以继续执行,因为我们知道这是安全的。但是我还是想让它所以,这里我还是输入 “N” 先不继续安装。那怎么解决信任问题呢?按照刚才的错误提示用Set-PSRepository来操作,将PSGallery设置为可信任源。
1
|
PS C:\Users\Administrator>> Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
|
再用下面的命令验证查看下确实已经为信任级别了。
1
2
3
4
5
|
PS C:\Users\Administrator>> Get-PSRepository
Name InstallationPolicy SourceLocation
---- ------------------ --------------
PSGallery Trusted https://www.powershellgallery.com/api/v2/
|
现在,终于可以安装PowerShellGet模块了,不过为了后续给大家介绍如何更新模块,我在这里就刻意安装一个非最新版本1.1.0.0的PowerShellGet,等等再来升级它。
1
|
PS C:\Users\Administrator> Install-Module -Name PowerShellGet -RequiredVersion 1.1.0.0
|
然后再用Update-Module来升级到指定的最新版本。
1
|
PS C:\Users\Administrator> Update-Module -Name PowerShellGet -RequiredVersion 1.1.2.0
|
就是这么简单,我用Get-Module配合ListAvaliable参数居然发现有3个版本,这是因为在PowerShell 5.0中考虑到了兼容性已经支持了相同模块但是多版本的功能。
1
2
3
4
5
6
7
8
9
|
PS C:\Users\Administrator> Get-Module -Name PowerShellGet -ListAvailable
Directory: C:\Program Files\WindowsPowerShell\Modules
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 1.1.2.0 PowerShellGet {Install-Module, Find-Module, Save-Module, Update-Module...}
Script 1.1.0.0 PowerShellGet {Install-Module, Find-Module, Save-Module, Update-Module...}
Script 1.0.0.1 PowerShellGet {Install-Module, Find-Module, Save-Module, Update-Module...}
|
总结
大致的介绍说完了,虽然只是一个安装升级模块的过程出现了点小插曲,但在这过程中我们却用到了许多相关命令。让我们总结下,我们用Find-Module来查找在线仓库里可用的模块版本。然后用Get-Module获得当前的版本信息号以此来比较是否需要更新。接着我们用Update-Module来更新模块,但知道了一个重要的点一旦能用Update-Module更新的模块包前提必须都是要用Install-Module方式来安装的。在安装的过程中我们用Set-PSRepository设置可信任的安装源,最后终于可以顺利安装了。
PackageSource
大家一定还发现还有其它三个有关于“PackageSource”相关的命令,我们就来探讨下这些命令。
首先你可以用Get-PackageSource命令查看下你当前配置中具备哪些PackageSource资源,如下:
1
2
3
4
5
|
PS C:\Users\Administrator> Get-PackageSource
Name Location Provider IsTrusted
---- -------- -------- ---------
chocolatey http://chocolatey.org/api/v2/ Chocolatey False
|
我们可以从上面的输出信息中看到,我们当前只有名为chocolatey的PackageSource资源。聪明的你一定已经发现了,剩下的3个PackageSource命令中,有一个Add-PackageSource的命令,它一定是可以用来帮我们添加额外的PackageSource,如下我们使用了Add-PackageSource命令来添加了一个名为AndersGet的资源池:
1
2
3
4
|
PS C:\Users\Administrator> Add-PackageSource -Name AndersGet -Provider chocolatey -Location
http://chocolatey.org/api/v2
/ -Trusted
|
创建完毕后,我们再次使用Get-PackageSource命令查看会得到:
1
2
3
4
5
6
|
PS C:\Users\Administrator> Get-PackageSource
Name Location Provider IsTrusted
---- -------- -------- ---------
chocolatey http://chocolatey.org/api/v2/ Chocolatey False
andersget http://chocolatey.org/api/v2/ Chocolatey True
|
那么添加好后自己的资源池后如何去使用里面的程序包呢?其实方法很简单和之前我们使用Find、Get以及Install来查找,查看以及安装程序包类似,我们依然使用Find-Package命令去查找程序包,只是这次我们需要使用Source参数去指定从我们指定的资源池中查找,方法如下:
1
2
3
4
5
|
PS C:\Users\Administrator> Find-Package -Source andersget -Name sysinternals
Name Version Status Source Summary
---- ------- ------ ------ -------
sysinternals 2014.05.13 Available chocolatey Sysinternals - utilities to help y...
|
最后你可以用Remove-PackageSource命令删除你不想用的资源池,如下:
1
2
3
4
5
6
7
|
PS C:\Users\Administrator> Remove-PackageSource -Name andersget
PS C:\Users\Administrator> Get-PackageSource
Name Location Provider IsTrusted
---- -------- -------- ---------
chocolatey http://chocolatey.org/api/v2/ Chocolatey False
|
很简单吧,下次我们将继续探讨关于,如何创建自定义的OneGet。