【问题标题】:PowerShell: How to mount drive programatically from SnapInPowerShell:如何从 SnapIn 以编程方式安装驱动器
【发布时间】:2010-10-04 23:07:35
【问题描述】:

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

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

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

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

有没有一种简单的方法可以在 snap in 中创建一个新的 psdrive?我还研究了从 FileSystemProvider 派生,但它是密封的。我研究了以编程方式运行 NewPSDriveCommand,但似乎不受支持。

我在这里遗漏了一些简单的东西吗?

谢谢!

编辑:我忘了提到,如果可能的话,我不想使用配置文件来完成此操作。我想将这个管理单元分发给其他人,我希望他们不必编辑他们的个人资料来让一切正常工作。

【问题讨论】:

    标签: powershell snap-in


    【解决方案1】:

    您可以在管理单元中创建 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...}
    

    【讨论】:

    • 谢谢,但是我将从这里派生什么基类?驱动器将使用 ProviderInfo 指定的提供程序创建,该提供程序来自示例代码中的基类。任何人都知道是否有办法获得对 FileSystemProvider 本身使用的 ProviderInfo 的引用?
    • 对不起,我看错了你的问题。我以为您想将 PSDrive 安装到您的自定义提供程序之一。
    【解决方案2】:

    您可以尝试将语句添加到您的 Powershell 全局或环境配置文件中。两者都位于 %username%\My Documents\WindowsPowerShell。您的全局配置文件名为 profile.ps1,您的环境配置文件为每个 shell 命名(Microsoft.PowerShell_profile.ps1 用于默认 Powershell 环境)。

    我的 profile.ps1 文件中有几个 new-psdrive 语句。这种方法的缺点是等待 Powershell 连接所有这些 PSDrive(如果它们位于慢速服务器上)。

    【讨论】:

    • 感谢您的建议,但我实际上想避免使用配置文件。请在原始问题中查看我的编辑。
    【解决方案3】:

    你可以把命令放在ps1文件里,加上选项-scope Global。

    【讨论】:

      【解决方案4】:

      您是在谈论创建一个 : 函数,以便您可以像使用文件系统驱动器(如 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);
      

      【讨论】:

        猜你喜欢
        • 2011-04-16
        • 2014-04-06
        • 2012-05-05
        • 2013-11-15
        • 1970-01-01
        • 2011-01-18
        • 1970-01-01
        • 2012-02-01
        • 2023-03-16
        相关资源
        最近更新 更多