1

我正在 C# 中创建一套自定义 cmdlet 和提供程序。我还有一个 PowerShell 管理单元,负责注册 cmdlet 和提供程序。我已经导出了一个控制台会话,以便我可以使用 -PSConsoleFile 参数启动 PowerShell 以自动加载我的管理单元。

我还想在使用管理单元运行 PS 时安装驱动器。实际上,我希望在 PS 会话开始时运行以下命令:

new-psdrive -name [驱动器名] -psprovider FileSystem -root [本地文件系统上文件夹的路径]

我尝试将上述命令放在 .ps1 文件中,并使用 -command 和 .ps1 文件的路径启动 PS,同时指定 -NoExit 标志。该脚本确实运行,但驱动器未在后续会话中映射。

有没有一种简单的方法可以在 snap in 中创建一个新的 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 命名空间中获取对文件系统 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,您的环境配置文件为每个 shell 命名(Microsoft.PowerShell_profile.ps1 用于默认 Powershell 环境)。

我的 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 回答