Powershell: приложения командной строки не работают после вызова метода из модуля - PullRequest
2 голосов
/ 25 ноября 2011

Я создал файл модуля powershell (.psm1), который включает несколько других сценариев powershell.Мы используем это для sharepoint.

Итак, вот что происходит:

  1. У меня есть сценарий развертывания, который получает местоположение модуля из реестра
  2. Он загружает модуль с помощью Import-ModuleКомандлет (с использованием ключа -force)
  3. Этот модуль, в свою очередь, загружает оснастку Sharepoint 2010 и несколько других созданных мной сценариев
  4. Он запускает сценарий развертывания, который ссылается на функции из включенных сценариев
  5. Он также запускает приложение командной строки и отправляет вывод непосредственно на экран

Сценарий обычно работает в первый раз.Однако после нескольких попыток инструмент командной строки перестанет работать и отправит вывод на экран в целом.И если я попытаюсь запустить инструмент командной строки (не 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

Я думаю, что до сих пор нет решения этой проблемы.

1 Ответ

1 голос
/ 04 марта 2012

Через некоторое время я заметил, что если я запустил некоторые очень ресурсоемкие функции, я тоже получил такое поведение, когда все, что вы пытаетесь выполнить, просто снова отправляется в подсказку. Я бы рекомендовал установить Set-PsDebug -Trace 2, чтобы увидеть, что эти функции на самом деле делают. Я исправил эту проблему, выяснив, как сделать мои функции более эффективными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...