繁体   English   中英

从自定义提供程序的C#代码加载Powershell模块

[英]Loading a Powershell Module from the C# code of a custom Provider

我一直在“非常需要”一个非常特定的功能,以绑定到我用C#编写的自定义提供程序。

基本上,我着手寻找一种方法来复制

A:
B:

等功能在PowerShell加载时定义,因此无需键入

CD A:

您可以执行上述操作

A:

我首先尝试让提供程序将功能注入到运行空间中,但是似乎我完全错过了使它起作用的时间,所以我走了另一条路。

基本上我有一个非常简单的PSM1文件UseColons.psm1

function Use-ColonsForPSDrives
{
    [CmdletBinding()] Param()

    Write-Verbose "Looping Through Installed PowerShell Providers"
    Get-PSProvider | % `
    {
        Write-Verbose "Found $($_.Name) checking its drives"
        $_.Drives | ? { (Get-Command | ? Name -eq "$($_.Name):") -eq $null } | `
        { 
            Write-Verbose "Setting up: `"function $($_.Name):() {Set-Location $($_.Name):}`""
            if ($Verbose)
            {
                . Invoke-Expression -Command "function $($_.Name):() {Set-Location $($_.Name):}" 
            }
            else
            {
                . Invoke-Expression -Command "function $($_.Name):() {Set-Location $($_.Name):}" -ErrorAction SilentlyContinue
        }
            Write-Verbose "Finished with drive $($_.Name)"
        }
    }
    # Cert and WSMan do not show up as providers until you try to naviagte to their drives
    # As a result we will add their functions manually but we will check if they are already set anyways
    if ((Get-Command | ? Name -eq "Cert:") -eq $null) { . Invoke-Expression -Command "function Cert:() {Set-Location Cert:}" }
    if ((Get-Command | ? Name -eq "WSMan:") -eq $null) { . Invoke-Expression -Command "function WSMan:() {Set-Location WSMan:}" }
}

. Use-ColonsForPSDrives

简单来说,它遍历所有已加载的提供程序,然后遍历每个提供程序的所有驱动器,然后检查Function:驱动器是否包含与{DriveName}:格式匹配的函数,如果找不到,则创建一个。

psd1文件只不过是导出所有功能

它存储在其自己的文件夹下的%ProgramFiles%\\ WindowsPowerShell \\ Modules路径中

最后我在%windir%\\ system32 \\ windowspowershell \\ v1.0目录下有profile.ps1

Remove-Module UseColons -ErrorAction SilentlyContinue
Import-Module UseColons

因此,当我加载PowerShell或ISE时,如果我想通过变量说出dir,我可以直接调用

Variable:

或者,如果我需要切换回注册表

HKLM:
HKCU:

当您与多个提供商合作时,在切换时一遍又一遍地键入该CD只会令人讨厌。

现在,对于这个问题,我仍在开发最初打算用于的实际PowerShell提供程序。 但是,当我调试它时,UseColons模块在Visual Studio转过来并加载新的提供程序之前就已加载,因此,如果我再次手动删除并导入该模块,它将完成它的工作,并且我将为提供程序提供所有驱动功能。

在长解释之后,我想知道我该怎么做:

  • 设置我的UseColons模块以加载LAST
  • 找到一种方法,让我的自定义提供程序(初始化时为模块,因为它具有提供程序和自定义Cmdlet)在初始化时加载UseColons模块
  • 我不想从我的标准配置文件中删除它,因为当我不使用新提供程序并且只是使用Powershell来管理内容时,它非常有用。

    希望有人可以给我一些想法,或为我提供一些更深入的潜水Powershell提供商文档和操作方法的指导。

    在您的模块清单( .psd1 )中,您有一个DLL作为RootModule吗?

    这是一个可怕的骇客,对将来创建的驱动器无济于事,但是...

    在模块清单中,而不是将YourProvider.dll用作RootModule,而应使用Dummy.psm1(可以是一个空文件)。 然后,对于NestedModules,使用@( 'YourProvider.dll', 'UseColons' ) 这样可以在UseProvider.dll 之后加载UseColons模块。 (假人将是最后的。)

    暂无
    暂无

    声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

     
    粤ICP备18138465号  © 2020-2024 STACKOOM.COM