Как создать ваш собственный репозиторий модулей
Энди Шнайдер (Andy Schneider) (из Get-PowerShell.com) недавно спросил меня, как он может проверить, что каждый из сотрудников Avanade может получить целостный набор модулей. Я столкнулся с похожей проблемой здесь, в Microsoft, когда захотел взять сценарии, которые написал для работы с внутренними приложениями, и упростить их использование для других людей, даже для тех кто не умеет работать с PowerShell. Я не хотел делать сценарии широкодоступными (кроме всего прочего, что люди вне Microsoft будут делать со сценарием, который работает с Product Studio?), но я хотел, чтобы сценарии (и PowerShell) устанавливались или обновлялись одним щелчком мыши.
На самом деле Сделать это просто. Все, что мне понадобилось, это совместное использование файлов в Windows. Я поместил этот небольшой командный файл (InstallModule.cmd) и создал две подпапки, x86 (куда поместил файл x86 CTP3 msi) и amd64 (для amd64 CTP msi). Когда я опубликовал файл .CMD в блоге команды PowerShell, мне захотелось принять душ, но в данном случае это было необходимое зло.
Вот модуль InstallModule.cmd:
if exist %windir%\system32\WindowsPowerShell\v1.0\powershell.exe goto :AlreadyInstalled
\\MyServer\MyShare\%processor_architecture%\PowerShell_Setup.msi
:AlreadyInstalled
echo %~dp0
xcopy "%~dp0\%1" "%userprofile%\Documents\WindowsPowerShell\Modules\%1" /y /s /i /d
Простите, я тут принимал душ... Вы все еще здесь? Я чувствую себя лучше. Опубликовав этот сценарий .CMD в блоге PowerShell, я почувствовал себя грязным , но примерно через 5 минут отдыха в положении плода мне стало достаточно комфортно, чтобы привести пояснения.
Первая строка переходит в каталог Windows (%windir%) и проверяет наличие там powershell.exe. Если он там есть, происходит переход на метку :AlreadyInstalled, и процедура установки пропускается. Если его там нет, сценарий переходит в каталог с соответствующим .MSI и устанавливает PowerShell. echo %~dp0 производит вывод места, где находится файл .CMD InstallModule.cmd. Это был искусственный объект, когда я его писал, но для следующего, кто запустит этот сценарий, это будет нормальной проверкой. В последней строке для установки модуля используется особая магия командных файлов и команда xcopy. %~dp0\%1 переводит работу в подкаталог каталога, где находится InstallModule.cmd + первый аргумент, так что если вы скажете \\MyServer\MyShare\InstallModule FooBar, сценарий будет копировать из \\MyServer\MyShare\FooBar. Место назначения немного проще: это %userprofile% (в моем случае C:\Users\JamesBru) + \Documents\WindowsPowerShell\Modules\ModuleName. Первый флаг (/y) скрывает подсказки ввода. Второй флаг (/s) копирует подкаталоги. Третий флаг (/i) указывает, что место назначения является каталогом. Последний флаг (/d) указывает, что если каталог уже создан, я хочу копировать файлы, которые новее, чем файлы в этом каталоге. Это означает, что я могу обновлять модули, просто помещая новые файлы в папку с общим доступом, и затем запускаю InstallModule.cmd. XCopy работает, но мне нужно снова принять душ.
Вы все еще здесь? Хорошо.
Теперь можно просто создать в \\MyServer\MyShare множество папок, содержащих модули. Для этого сценария не имеет значения, что это за модули – скомпилированные программы или сценарии. Если вы хотите упростить установку одного модуля, вы можете поместить его в небольшой файл, такой как InstallMyModule.cmd. InstallMyModule.cmd всегда очень прост. Вот, например: \\myServer\MyShare\InstallModule.cmd MyModule. Поскольку каждый модуль устанавливается в каталог пользователя, вам даже не надо беспокоиться о запуске InstallMyModule.cmd с повышеными привилегиями.
Я искренне извиняюсь за то что опубликовал скрипты для CMD в блоге команды PowerShell. Но надеюсь эта полезная информация позволит вам устанавливать столько репозиториев мелких модулей, сколько потребуется, и упростит обычным пользователям начало использования PowerShell.
Надеюсь, это вам поможет,
Джеймс Брандейдж (James Brundage) [MSFT]
Перевод: Виктор Горбунков