Powershell 的知识串联I PSDrive 与 PSProvider

Powershell 的知识串联I PSDrive 与 PSProvider

前言

微软在官方文档中对 PSDrive 的描述不尽深入

  1. PSDrive: 显示由提供程序公开的驱动器与 Windows 逻辑驱动器
  2. PSProvider: 一种允许文件系统访问数据存储的接口

这些驱动与接口跟以下命令相关:

  1. *-Alias: 操作命令别名
  2. *-Item: 操作文件,注册表等
  3. *-Variable: 操作变量

PSDrive 与 PSDrive

Get-PSProvider 一般给我们输出以下结果:

NameCapabilitiesDrives
RegistryShouldProcess{HKLM, HKCU}
AliasShouldProcess{Alias}
EnvironmentShouldProcess{Env}
FileSystemFilter, ShouldProcess, Credentials{C, D}
FunctionShouldProcess{Function}
VariableShouldProcess{Variable}
CertificateShouldProcess{Cert}
WSManCredentials{WSMan}

Get-PSDrive 则给我们输出以下结果:

NameUsed (GB)Free (GB)ProviderRoot
AliasAlias
C145.3133.75FileSystemC:\
CertCertificate\
D124.35161.19FileSystemD:\
EnvEnvironment
FunctionFunction
HKCURegistryHKEY_CURRENT_USER
HKLMRegistryHKEY_LOCAL_MACHINE
Temp145.3133.75FileSystemC:\Users\Sie\AppData\Local\Temp\
VariableVariable
WSManWSMan

Alias 驱动器

  1. Get-Alias 的效果与 Get-ChildItem Alias: 是一致的
  2. 相似的 Get-ChildItem Alias:cls 等同于 Get-Alias cls
  3. 上边的两种方式都返回 System.Management.Automation.AliasInfo 对象(数组)

Variable 驱动器

  1. Get-ChildItem Variable: 在全新的会话中,可以获得自动变量1列表 与 首选项变量2列表
  2. Set-Variable -Name newOne -Value 1New-Item -Path Variable:newOne -Value 1$newOne=1 是一致的
  3. Remove-Item Variable:newOneRemove-Variable newOne$newOne=$null 是一致的
  4. (Set-Variable -Name newVar -Value 1 -PassThru) -eq (Get-Item Variable:newVar) 的结果为 true
  5. Set-Variable -Name newO -Value 1 -PassThru | foreach { $newO; Remove-Item "Variable:$($_.Name)"; $newO -eq $null } 输出 1true

Env 驱动器

  1. $env:PATH[System.Environment]::GetEnvironmentVariable('Path') 可以获得计算机的 PATH
  2. New-Item -Path "Temp:$(New-Guid).txt"New-Item -Path (Join-Path $env:TMP "$(New-Guid).txt") 是一致的

持久化环境变量

  1. [Environment]::SetEnvironmentVariable('Foo', 'Bar', 'Machine'): 设置到计算机域中
  2. 对于 pwsh 会话,notepad $PROFILE3,添加 $Env:Foo='Bar'
  3. 使用高级系统属性: & SystemPropertiesAdvanced.exe

HKLM 与 HKCU 驱动器

  1. 这两个都由 Registry 提供, 关联 regedit.exe 编辑器, 可由 Set-Location HKLM: 进入
  2. Get-Item -Path HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem | Set-Variable fs -PassThru | % {$fs.GetValueNames()} | Select-Object @{n='键';e={$_}},@{n='值';e={$fs.GetValue($_)}} 打印 FileSystem 路径下的所有键值对, 包含常见的长路径定义 LongPathsEnabled

  1. Get-ChildItem Variable: 返回的列表不可再声明, 如 $input 是后台任务 Job 的一个单一输入
  2. Import-Module $moduleName 可用于导入 PSProviderPSDrive

脚注

  1. 自动变量列表
  2. 首选项变量列表
  3. $PROFILE 文件