我正在使用C#创建一套自定义cmdlet和提供程序。我还有一个PowerShell SnapIn,负责注册cmdlet和提供程序。我已导出控制台会话,以便我可以使用-PSConsoleFile参数启动PowerShell以自动加载我的快照。
每当我通过管理单元运行PS时,我也想安装一个驱动器。实际上,我希望在PS会话开始时运行以下命令:
new-psdrive -name [drivename] -psprovider FileSystem -root [本地文件系统上文件夹的路径]
我尝试将上述命令放在.ps1文件中并使用-command和.ps1文件的路径启动PS,同时指定-NoExit标志。该脚本确实运行,但驱动器未在后续会话中映射。
是否有一种简单的方法可以在快照中创建新的psdrive?我还研究了从FileSystemProvider派生但它是密封的。我考虑以编程方式运行NewPSDriveCommand,但似乎不支持。
我在这里错过了一些简单的东西吗?
谢谢!
编辑:我忘了提到我不想使用配置文件来尽可能地完成此操作。我想将此快照分发给其他人,我希望他们不必编辑他们的个人资料以使一切工作。
答案 0 :(得分:2)
您可以在snapin中创建一个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的FileSystem提供程序信息是:
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...}
答案 1 :(得分:0)
您可以尝试将语句添加到Powershell全局或环境配置文件中。两者都位于%username%\ My Documents \ WindowsPowerShell。您的全局配置文件名为profile.ps1,并且为每个shell命名了您的环境配置文件(默认的Powershell环境为Microsoft.PowerShell_profile.ps1)。
我在profile.ps1文件中有几个new-psdrive语句。这种方法的缺点是等待Powershell连接所有这些PSDrives,如果它们在慢速服务器上。
答案 2 :(得分:0)
您可以将命令放在ps1文件中,并添加选项-scope Global。
答案 3 :(得分:0)
您是否在谈论创建一个:function,以便您可以像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);