1

C# で一連のカスタム コマンドレットとプロバイダーを作成しています。また、コマンドレットとプロバイダーの登録を処理する PowerShell スナップインもあります。-PSConsoleFile パラメーターを使用して PowerShell を起動し、スナップインを自動的に読み込むことができるように、コンソール セッションをエクスポートしました。

また、スナップインで PS を実行するたびにドライブをマウントしたいと考えています。事実上、PS セッションの開始時に次のコマンドを実行したいと考えています。

new-psdrive -name [ドライブ名] -psprovider FileSystem -root [ローカル ファイル システム上のフォルダーへのパス]

上記のコマンドを .ps1 ファイルに入れ、-command と .ps1 ファイルへのパスを指定して PS を起動し、-NoExit フラグも指定しようとしました。スクリプトは実行されますが、後続のセッションでドライブがマップされません。

スナップインで新しい psdrive を作成する簡単な方法はありますか? FileSystemProvider からの派生も調べましたが、封印されています。NewPSDriveCommand をプログラムで実行することを検討しましたが、サポートされていないようです。

ここで簡単なものが欠けていますか?

ありがとう!

編集:可能であれば、プロファイルファイルを使用してこれを達成したくないことを忘れていました。このスナップを他の人に配布したいのですが、すべてを機能させるためにプロファイルを編集する必要はありません。

4

4 に答える 4

2

スナップインで PSDrive を作成できます。プロバイダーの一部として、オーバーライドできるメソッドInitializeDefaultDrivesがあります。

例:

protected override Collection<PSDriveInfo> InitializeDefaultDrives()
        {
            Collection<PSDriveInfo> drives = new Collection<PSDriveInfo>();

            drives.Add(new PSDriveInfo(
                "YourDriveName",
                ProviderInfo,
                "YourDriveRoot",
                "Description of Your Drive",
                null));

            return drives;
        }

質問とコメントを読み直した後: Microsoft.PowerShell.Core 名前空間から filesystem providerinfo オブジェクトへの参照を取得できる可能性があります...まだテストしていません...

PowerShell からのファイル システム プロバイダー情報は次のとおりです。

PS C:\scripts\PowerShell> Get-PSProvider filesystem | fl *


ImplementingType : Microsoft.PowerShell.Commands.FileSystemProvider
HelpFile         : System.Management.Automation.dll-Help.xml
Name             : FileSystem
PSSnapIn         : Microsoft.PowerShell.Core
ModuleName       : Microsoft.PowerShell.Core
Module           :
Description      :
Capabilities     : Filter, ShouldProcess
Home             : H:\
Drives           : {C, A, D, H...}
于 2009-02-02T17:54:17.870 に答える
0

ステートメントをPowershellグローバルプロファイルまたは環境プロファイルに追加してみてください。どちらも%username%\ My Documents\WindowsPowerShellにあります。グローバルプロファイルの名前はprofile.ps1で、環境プロファイルの名前はシェルごとに付けられています(デフォルトのPowershell環境の場合はMicrosoft.PowerShell_profile.ps1)。

profile.ps1ファイルにいくつかのnew-psdriveステートメントがあります。この方法の欠点は、Powershellが低速のサーバー上にある場合にそれらすべてのPSDriveを接続するのを待っていることです。

于 2009-02-02T16:35:58.823 に答える
0

コマンドを ps1 ファイルに入れ、オプション -scope Global を追加できます。

于 2009-03-19T08:57:56.237 に答える
0

c: のようなファイル システム ドライブと同じように、そのドライブに切り替えることができるように : 関数を作成することについて話しているのですか?

NewDrive メソッドの最後に次のコードがあります。

// create the <drive>: alias
string func = string.Format("function {0}: {{ set-location {0}: }}", drive.Name);
this.InvokeCommand.InvokeScript(
       func
       , false
       , System.Management.Automation.Runspaces.PipelineResultTypes.None
       , null
       , null);

次に、RemoveDrive メソッドで、一致する関数を削除する一致する削除呼び出しを行います。

string func = string.Format("function {0}: {{ remove-item function:\ {0}: }}"
       , drive.Name);
this.InvokeCommand.InvokeScript(
       func
       , false
       , System.Management.Automation.Runspaces.PipelineResultTypes.None
       , null
       , null);
于 2014-07-16T07:21:47.997 に答える