Я создал файл модуля powershell (.psm1), который включает несколько других сценариев powershell.Мы используем это для sharepoint.
Итак, вот что происходит:
- У меня есть сценарий развертывания, который получает местоположение модуля из реестра
- Он загружает модуль с помощью Import-ModuleКомандлет (с использованием ключа -force)
- Этот модуль, в свою очередь, загружает оснастку Sharepoint 2010 и несколько других созданных мной сценариев
- Он запускает сценарий развертывания, который ссылается на функции из включенных сценариев
- Он также запускает приложение командной строки и отправляет вывод непосредственно на экран
Сценарий обычно работает в первый раз.Однако после нескольких попыток инструмент командной строки перестанет работать и отправит вывод на экран в целом.И если я попытаюсь запустить инструмент командной строки (не cmd-let) после запуска моего скрипта, он больше не будет работать: ничего не выводится, ничего не делается.Точно так же, как нажатие клавиши ввода в пустом окне.все, что связано с PowerShell или работает с приложениями с графическим интерфейсом, будет работать нормально, но запуск любого консольного приложения не даст каких-либо результатов.Единственное решение - просто закрыть мой PowerShell и открыть его снова.это будет работать обычно один раз, и мне придется закрыть его снова.наши пользователи, конечно же, не будут этому рады ..
Наиболее «заметные» вещи в скрипте:
- скриптовые блоки широко используются (для регистрации), блок скрипта отправляетсяобработчик, который выполняет его с помощью invokecommand и регистрирует шаг
- своих манипулирующих объектов sharepoint
- все объекты должным образом утилизируются
- статические переменные не создаются и не изменяются
- Есть несколько глобальных переменных, общих для всех сценариев
То, что я пробовал: я сократил свой код до минимума: загрузил файл XML и перезапустил несколько служб Windows, но явсе еще получаю это с перерывами.Я понятия не имею, какая часть кода может вызвать это.Я хотел бы опубликовать код, но наша политика компании запрещает мне.так что мои извинения ..
Обновление согласно комментарию ниже:
вот примерно как я использую кодовые блоки.У меня есть эта функция ниже, которая используется каждый раз, когда я хочу, чтобы пользователь знал о задаче, которую я выполняю, и каков ее результат.
function DoTask($someString, $scriptBlock, $param)
{
try
{
OutputTaskDescription $someString
InvokeCommand $scriptBlock -ArgumentList $param
OutputResultOK
}
catch
{
OutputResultError $_.tostring()
}
}
затем ее можно использовать так:
$stringVar = "something"
$SpSite = new-spsite
deploySomething 'Deploying something' -param $spsite -ScriptBlock {
dosomethingToObject $stringvar
dosomethingToObject $spSite.Name
}
затем будет выведено что-то вроде:
Deploying Something ------------- OK
Deploying Something ------------- ERROR
Также обратите внимание, что я передаю $ spsite в список аргументов и просто использую строку напрямую.Я до сих пор не понимаю, как это работает, но мне кажется, что я могу получить доступ ко всем типизированным переменным примитивам, даже не передавая их в качестве аргументов, но мне приходится передавать более сложные объекты как параметры, иначе они не имеют никакого значения.
Обновление: после долгих поисков и дней боли.Я нашел других с такой же болью.Мой код демонстрирует точно такие же симптомы, как описано здесь: http://connect.microsoft.com/PowerShell/feedback/details/496326/stability-problem-any-application-run-fails-with-lastexitcode-1073741502
Я думаю, что до сих пор нет решения этой проблемы.