[PowerShell入门]提供程序和驱动器

提供程序和驱动器

PowerShell系列好久没更新了,主要原因是有些主题涉及的内容太多了,一时间不知道怎么整理成文章发出来。近期刚好因为一点小问题又折腾了一下PowerShell,就顺便整理出这么一篇文章,介绍一下PowerShell中很重要的提供程序和驱动器。

提供程序(Provider)

Provider这个词在很多中文资料中被翻译为“提供程序”,刚开始学习PowerShell时看到这个词的我是这样子的:

要理解这个概念,其实只要读一读它的英文名就可以了。Provider,提供者,提供什么呢?在PowerShell中,Provider提供的是数据。它提供的数据可以是文件,也可以是环境变量,也可以是注册表信息。说到这里你可能还是有点懵(内心:这玩意儿到底嘎哈用的?),不过没关系,你只要记住它是提供数据的就行了,请继续往下读。

驱动器(Drive)

那驱动器又是什么?说到驱动器,大多数人首先会想到的应该是各种“CDEF盘”,不过PowerShell中的驱动器可没有那么简单。如果说提供程序提供了数据,那么驱动器就是提供了索引数据的方式,也可以说驱动器通过一个特定的提供程序连接到存储数据的介质。

举个例子:FileSystem是PowerShell一个内置的提供程序,它提供了文件系统相关的数据,而C盘就是属于FileSystem的一个驱动器,通过C:\path\to\file的形式我们可以索引到提供程序提供的数据(文件或文件夹)。

PowerShell中的驱动器跟提供程序是多对一的关系,就像一个提供文件数据的提供程序可以对应多个文件系统驱动器(CDEF盘)一样。

项(Item)

仔细看看文件系统、注册表、环境变量等数据源的构成,我们能发现其实这些系统之间有很多相似之处:

  • 它们都是树型结构
  • 每一项数据都能对应一个路径,像文件路径和注册表项路径(这个特性是基于其树形结构的)
  • 每一项数据都是由名字、内容和属性构成的

所以PowerShell又引入了另一个概念——项(Item)。PowerShell将提供程序提供的数据抽象为一个个的项(文件是项,文件夹是项,注册表项是项,环境变量也是项),将数据统一以项的形式表现。

PowerShell通过这种形式,将数据以一致的形式公开,这样我们可以以相同的方式对这些不同类型的数据进行管理了!试想一下,你可以用与修改文件内容相同的方式修改环境变量,是不是很有意思呢?

内置提供程序和驱动器

PowerShell内置了以下的提供程序和驱动器:

ProviderDriveData store
AliasAlias:cmdlet别名
CertificateCert:数字签名证书
EnvironmentEnv:环境变量
FileSystem*文件和文件夹
FunctionFunction:PowerShell函数
RegistryHKLM:, HKCU:注册表,其中的两个驱动器HKLM:对应注册表的HKEY_LOCAL_MACHINE,HKCU:对应HKEY_CURRENT_USER
VariableVariable:PowerShell中的变量
WSManWSMan:WS-Management配置信息

使用这些内置的驱动器,就可以访问并管理提供程序提供的数据了:

PS > Set-Content Env:\Test test
PS > Get-Content Env:\Test
test
PS > Get-Content Variable:\PID
27631

注意路径中驱动器名字要加冒号(:),Windows上的路径分隔符是使用反斜杠(\)的。

相关cmdlet

获取Provider

Get-PSProvider [[-PSProvider] <String[]>] [<CommonParameters>]

使用Get-PSProvider命令用于获取提供程序对象(System.Management.Automation.ProviderInfo)。参数-PSProvider可以指定要获取的提供程序的名字,可以使用通配符,不指定时获取所有提供程序对象。

PS > Get-PSProvider e*, f*

Name                 Capabilities                            Drives
----                 ------------                            ------
Environment          ShouldProcess                           {Env}
FileSystem           Filter, ShouldProcess, Credentials      {C}
Function             ShouldProcess                           {Function}

使用Get-Member可以获取到提供程序对象的属性和方法:

PS > Get-PSProvider | Get-Member


   TypeName:System.Management.Automation.ProviderInfo

Name             MemberType Definition
----             ---------- ----------
Equals           Method     bool Equals(System.Object obj)
GetHashCode      Method     int GetHashCode()
GetType          Method     type GetType()
ToString         Method     string ToString()
Capabilities     Property   System.Management.Automation.Provider.ProviderCapabilities Capabilit...
Description      Property   string Description {get;set;}
Drives           Property   System.Collections.ObjectModel.Collection[System.Management.Automati...
HelpFile         Property   string HelpFile {get;}
Home             Property   string Home {get;set;}
ImplementingType Property   type ImplementingType {get;}
Module           Property   psmoduleinfo Module {get;}
ModuleName       Property   string ModuleName {get;}
Name             Property   string Name {get;}
PSSnapIn         Property   System.Management.Automation.PSSnapInInfo PSSnapIn {get;}
  • Capabilities:提供程序支持的功能
    • Credentials 表示允许使用可变更的凭据连接数据存储
    • Filter 表示对项的操作支持-Filter参数
    • ShouldProcess 表示对项的操作支持-WhatIf和-Confirm参数
    • Transactions 表示支持事务
  • Description:描述信息
  • Drives:提供程序包含的驱动器对象
  • HelpFile:帮助文件的路径
  • Home:在相应驱动器中“~”号所对应的路径
  • ImplementingType:具体实现的类
  • PSSnapIn:提供该提供程序的组件

获取Drive

Get-PSDrive [-LiteralName|[-Name] <String[]>] [-PSProvider <String[]>] [-Scope <String>] [-UseTransaction] [<CommonParameters>]

使用Get-PSDrive命令用于获取驱动器对象(System.Management.Automation.PSDriveInfo)。其参数列表如下:

  • -LiteralName用于指定驱动器的名字,使用这个参数指定驱动器会忽略通配符
  • -Name也是用于指定驱动器名字的,不过使用这个参数时可以使用通配符,不指定驱动器名字时列出所有的驱动器
  • -PSProvider指定从哪些提供程序中获取驱动器,可以使用通配符
  • -Scope指定获取驱动器的范围,可选值有Global、Local(默认)、Script和相对当前范围的数字(0是当前范围,1是父级)
  • -UseTransaction将命令放入事务,这个参数只有在进行事务时才有作用

同样,我们使用Get-Member看看驱动器对象中保存了哪些信息:

PS > Get-PSDrive | Get-Member


   TypeName:System.Management.Automation.PSDriveInfo

Name            MemberType     Definition
----            ----------     ----------
CompareTo       Method         int CompareTo(System.Management.Automation.PSDriveInfo d...
Equals          Method         bool Equals(System.Object obj), bool Equals(System.Manag...
GetHashCode     Method         int GetHashCode()
GetType         Method         type GetType()
ToString        Method         string ToString()
Credential      Property       pscredential Credential {get;}
CurrentLocation Property       string CurrentLocation {get;set;}
Description     Property       string Description {get;set;}
DisplayRoot     Property       string DisplayRoot {get;}
MaximumSize     Property       System.Nullable[long] MaximumSize {get;}
Name            Property       string Name {get;}
Provider        Property       System.Management.Automation.ProviderInfo Provider {get;}
Root            Property       string Root {get;}
Free            ScriptProperty System.Object Free {get=## Ensure that this is a FileSys...
Used            ScriptProperty System.Object Used {get=## Ensure that this is a FileSys...
  • Credential:指定身份凭据,否则无法查看使用别的用户创建的驱动器
  • CurrentLocation:记录当前位置,当从别的驱动器回到该驱动器时会跳转至这个位置
  • Description:提供描述信息
  • DisplayRoot:这个参数在内置驱动器中都为空,所以暂时不清楚作用,如果你知道它的作用,烦请联系博主
  • MaximumSize:这个参数在内置驱动器中都为空,所以暂时不清楚作用,如果你知道它的作用,烦请联系博主
  • Name:驱动器名字
  • Provider:该驱动器属于哪个提供程序
  • Root:根路径
  • Free:可用空间(仅FileSystem)
  • Used:已用空间(仅FileSystem)

新建Drive

New-PSDrive [-Name] <String> [-PSProvider] <String> [-Root] <String> [-Confirm] [-Credential <PSCredential>] [-Description <String>] [-Persist] [-Scope <String>] [-UseTransaction] [-WhatIf] [<CommonParameters>]

创建驱动器,关联到某个网络或者本地位置。这个命令创建的驱动器分为临时驱动器或者网络映射驱动器,网络映射驱动器可以保存到本地主机。

  • -Name指定新驱动器的名字,对于网络映射驱动器,需要键入一个盘符,其它的可以使用任意名字
  • -PSProvider指定提供程序,临时驱动器可以关联任何提供程序,网络映射驱动器必须是FileSystem
  • -Root指定新驱动器的根路径,临时驱动器可以是任何路径,网络映射驱动器只能关联远程主机的文件路径(使用UNC路径)
  • -Confirm在运行cmdlet的时候显示确认操作的信息
  • -Credential指定一个有该命令执行权限的用户,默认是当前用户,输入一个用户名或者由Get-Credential生成的PSCredential对象,-Root参数是一个UNC路径时可以使用这个参数
  • -Description指定驱动器的描述信息
  • -Persist表示这个命令会创建一个网络映射驱动器,当没有使用点语法运行脚本时,驱动器不会保存到运行环境以外
  • -Scope指定驱动器的生效范围,可选值有Global、Local(默认)、Script和相对当前范围的数字(0是当前范围,1是父级)
  • -UseTransaction将命令放入事务,这个参数只有在进行事务时才有作用
  • -WhatIf显示调试信息,加入这个参数时不会实际创建驱动器
PS > New-PSDrive -Name me -PSProvider FileSystem -Root C:\Users\ganzi

Name   Used (GB)   Free (GB)   Provider     Root
----   ---------   ---------   --------     ----
me          0.00       62.58   FileSystem   C:\Users\ganzi

移除Drive

Remove-PSDrive -LiteralName|[-Name] <String[]> [-Confirm] [-Force] [-PSProvider <String[]>] [-Scope <String>] [-UseTransaction] [-WhatIf] [<CommonParameters>]

该命令用于移除New-PSDrive命令创建的临时驱动器,并且断开映射到网络驱动器的连接,该命令无法删除物理驱动器。

  • -LiteralName用于指定驱动器的名字,使用这个参数指定驱动器会忽略通配符
  • -Name也是用于指定驱动器名字的,不过使用这个参数时可以使用通配符
  • -Confirm在运行cmdlet的时候显示确认操作的信息
  • -Force强制删除
  • -PSProvider指定从哪些提供程序中删除驱动器,可以使用通配符
  • -Scope指定驱动器删除的范围
  • -UseTransaction将命令放入事务,这个参数只有在进行事务时才有作用
  • -WhatIf显示调试信息,加入这个参数时不会实际删除驱动器

这个命令也可以通过管道输入PSDriveInfo对象:

PS > Remove-PSDrive -Name smp
PS > Get-PSDrive X, S | Remove-PSDrive

Tips

  • 如果你需要其中某个提供程序的详细信息,只需要运行Get-Help $ProviderName -Full
  • 提供程序由管理单元(snap-in)提供,虽然无法删除提供程序,但是可以使用Remove-PSSnapin移除管理单元从而达到移除提供程序的效果
  • 提供程序可以将参数动态添加到内置的cmdlet中,这些参数仅在cmdlet和提供程序数据一起使用时才可用,比如在Cert驱动器中使用Get-ItemGet-ChildItem命令时可以使用-CodeSigningCert参数
  • 当一个新的驱动器接入电脑,PowerShell会自动向FileSystem提供程序添加一个驱动器对象而不需要重启,当驱动器断开连接后,PowerShell也会自动移除这个对象
  • 关于注册表提供程序只有两个根节点,没有HKEY_CLASSES_ROOT等节点的问题,PSTips上有解释:

    事实上HKEY_CLASSES_ROOT根节点不是一个独立的根节点,而是指向HKEY_LOCAL_MACHINE\SOFTWARE\Classes。

  • 可以使用脚本将特殊文件夹加入虚拟驱动器:PowerShell 添加个性化驱动器

总结

PowerShell通过提供程序-驱动器-项的组合,对数据进行抽象,使得我们可以使用相同的方式管理来源不同,但是却有相似之处的数据。不得不说这种设计比同类其它产品先进许多,充分发挥了PowerShell面向对象的优势,不过这也使得学习成本变高不少。

下一篇计划讲讲关于PowerShell中项的操作,如果不出意外的话,我们一周后见!

参考资料

  • PowerShell官方文档
  • 《Windows PowerShell实战指南》
  • PSTips

感谢以上内容的提供者!

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: PowerShell是一种命令行工具和脚本语言,它可以帮助管理员自动化任务和管理Windows操作系统。它使用.NET框架,并且可以访问Windows管理接口(WMI)和其他系统管理API。要入门PowerShell,您需要学习基本语法和命令,了解如何使用PowerShell管理文件和文件夹,以及如何使用PowerShell管理Windows服务和进程。您还可以学习如何编写PowerShell脚本来自动化常见的管理任务。 ### 回答2: PowerShell是一个命令行界面和脚本语言,在Windows操作系统中提供了一种强大的管理员工具,它是Windows管理员最常使用的工具之一。PowerShell的目标是使管理员的工作更加轻松和自动化。本文将介绍PowerShell入门知识。 一、PowerShell的基础知识 PowerShell的基础命令是cmdlet(简单指令),它是PowerShell的核心对象之一。通过执行cmdlet,用户可以获取系统的信息、管理系统、创建对象以及执行操作等等。PowerShell的cmdlet是由系统提供的,也可以由用户自定义。PowerShell的文件扩展名是 .ps1,它是PowerShell的脚本。 二、使用PowerShell实现各种操作 在使用PowerShell时,可以使用不同的命令来实现各种操作。以下是PowerShell的各种命令: 1. Get-Command:获取系统上可用的cmdlet和函数的信息。 2. Get-Help:获取有关某个cmdlet的详细信息和示例。 3. Get-Process:获取在计算机上正在运行的进程。 4. Get-Service:获取计算机上已安装的服务。 5. Set-Service:启动、停止或重启特定的服务。 6. Start-Process:启动一个新的进程。 7. Stop-Process:停止正在运行的进程。 8. Get-EventLog:获取Windows事件日志的信息。 9. Get-WMIObject:获取计算机上或远程计算机上的Windows管理信息。 三、PowerShell的常见用途 除了上面提到的操作之外,PowerShell可以用于以下任务: 1. PowerShell可以用于自动化任务,例如部署系统更新、测试软件等。 2. PowerShell可以用于管理系统,例如获取系统硬件、操作系统和应用程序的信息。 3. PowerShell可以用于执行诸如注册表修改、文件操作和网络配置等任务。 4. PowerShell可以对于需要定期复制的文件,创建一个自动任务程序,定时复制文件,也可以到具体错误文件,准确判断故障原因。 5. PowerShell还可以将数据转换为CSV文件,使用SQL Server Analysis Services (SSAS) 或 Excel等工具进行数据分析。 四、如何学习PowerShell 如果你想学习PowerShell入门知识,你可以: 1. 下载和安装PowerShell。 2. 阅读PowerShell的帮助文件,包括Get-Help cmdlet命令的帮助信息。 3. 学习PowerShell的基本语法和命令,例如:cmdlet、管道、参数等。 4. 阅读PowerShell的脚本,可以从中学习如何编写脚本以及如何使用cmdlet执行操作。 5. 看PowerShell的视频教程,例如PowerShell入门课程等。 总之,PowerShell是一个强大的管理工具,在Windows系统中有着广泛的应用。学习PowerShell需要一定的时间和耐心,但一旦掌握了PowerShell的基础知识,您就可以节省大量的时间和精力来管理系统和自动化任务。 ### 回答3: Powershell是一种面向对象的Shell和脚本语言,由微软公司开发推出,用于 windows 系统下的管理和自动化的任务。很多人认为,Powershell是一种强大的工具,提供了许多管理和脚本功能,能够很好地利用现有的技能和知识来实现更高效的管理和自动化任务。 设置Powershell 首次打开Powershell会话后,需要执行Set-ExecutionPolicy命令进行权限设置,以便启用Powershell脚本。在管理模式下,输入以下命令: Set-ExecutionPolicy Unrestricted 这个命令可以让你运行任何脚本。如果不想运行任何脚本,也可以: Set-ExecutionPolicy Restricted 但是,这样将会禁止任何脚本的执行。 完成这些设置后,你就可以使用Powershell进行管理和脚本编写了。 基础命令 Powershell有很多基础命令,这里只简单列举: 获取帮助:help 列出命令:get-command 执行命令:invoke-command 获取电脑信息:get-process 显示输出:write-output 变量:$variable,可以存储任何类型的数据。 学习Powershell的秘诀 要学习Powershell,需要: 了解基本的脚本语言结构。 熟悉Powershell自带的命令和别名。 使用在线学习资源,如微软官方文档和社区论坛。 实践编写脚本。 与其它Powershell爱好者进行交流。 总之,学习Powershell需要付出时间和精力,但这将会带来更高效的管理和自动化技能,让你在IT管理中受益匪浅。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值