簡體   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