1

私は、C# で記述しているカスタム プロバイダーに関連付ける非常に特定の機能の "必要性" に取り組んできました。

基本的に、私は複製する方法を見つけることに着手しました

A:
B:

入力する代わりに、PowerShell の読み込み時に定義される etc 関数

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

簡単に言えば、ロードされたすべてのプロバイダーをループし、次に各プロバイダーのすべてのドライブをループして、{DriveName}: 形式に一致する関数が Function: ドライブに含まれているかどうかを確認し、見つからない場合は作成します。

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 プロバイダーの開発に取り組んでいます。しかし、それをデバッグすると、Visual Studio が向きを変える前に UseColons モジュールが読み込まれ、新しいプロバイダーが読み込まれるため、モジュールを手動で削除して再度インポートすると、その機能が実行され、プロバイダーのすべてのドライブ機能が得られます。

その長い説明の後で、次のいずれかを行う方法を知りたいと思いました。

  • UseColons モジュールをセットアップして LAST をロードする
  • 初期化時にカスタム プロバイダー (プロバイダーとカスタム コマンドレットがあるため、技術的にはモジュール) が UseColons モジュールをロードする方法を見つけます。
  • 標準プロファイルから削除したくありません。これは、新しいプロバイダーに取り組んでおらず、管理用に powershell を使用するだけのツールを使用しているときに非常に役立つためです。

    うまくいけば、誰かが私にいくつかのアイデアを提供したり、優れた深いダイブ PowerShell プロバイダーのドキュメントやハウツーの方向性を教えてくれたりします。

    4

    1 に答える 1