PowerShell: как программно смонтировать диск из SnapIn - PullRequest
1 голос
/ 02 февраля 2009

Я создаю набор пользовательских командлетов и поставщиков в C #. У меня также есть PowerShell SnapIn, который заботится о регистрации командлетов и провайдеров. Я экспортировал сеанс консоли, чтобы я мог запустить PowerShell с параметром -PSConsoleFile для автоматической загрузки оснастки.

Я также хочу подключить диск всякий раз, когда запускаю PS с оснасткой. В действительности, я хочу, чтобы в начале сеанса PS запускалось следующее:

new-psdrive -name [drivename] -psprovider FileSystem -root [путь к папке в локальной файловой системе]

Я попытался поместить вышеуказанную команду в файл .ps1 и запустить PS с -command и путем к файлу .ps1, также указав флаг -NoExit. Сценарий выполняется, но диск не отображается в следующем сеансе.

Есть ли простой способ создать новый psdrive в оснастке? Я также посмотрел на получение от FileSystemProvider, но он запечатан. Я пытался запустить NewPSDriveCommand программно, но это не поддерживается.

Я что-то упустил здесь?

Спасибо!

Редактировать: Я забыл упомянуть, что я не хочу использовать файл профиля для достижения этой цели, если это возможно. Я хочу передать эту оснастку другим, и я бы предпочел, чтобы им не приходилось редактировать свои профили, чтобы все заработало.

Ответы [ 4 ]

2 голосов
/ 02 февраля 2009

Вы можете создать 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 ... Хотя я еще не проверял это ...

Информация о поставщике файловой системы из 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...}
0 голосов
/ 16 июля 2014

Вы говорите о создании функции:, чтобы вы могли переключаться на этот диск, как вы можете с дисководами файловой системы, такими как 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);
0 голосов
/ 19 марта 2009

Вы можете поместить команду в файл ps1 и добавить опцию -scope Global.

0 голосов
/ 02 февраля 2009

Вы можете попытаться добавить операторы в свой глобальный профиль или профиль среды Powershell. Оба находятся в% username% \ My Documents \ WindowsPowerShell. Ваш глобальный профиль называется profile.ps1, а профиль вашей среды назван для каждой оболочки (Microsoft.PowerShell_profile.ps1 для среды Powershell по умолчанию).

В моем файле profile.ps1 есть пара операторов new-psdrive. Недостаток этого метода заключается в ожидании подключения Powershell ко всем этим PSDrive, если они находятся на медленном сервере.

...