Powershell:从模块调用方法后,命令行应用程序无法正常工作

时间:2011-11-25 10:11:47

标签: sharepoint powershell

我创建了一个powershell模块(.psm1)文件,其中包含一些其他的PowerShell脚本。我们将它用于sharepoint。

基本上,这就是发生的事情:

  1. 我有一个部署脚本,可以从注册表中检索模块位置
  2. 使用Import-Module cmdlet(使用-force开关)
  3. 加载模块
  4. 此模块依次加载Sharepoint 2010管理单元以及我创建的一些其他脚本
  5. 它运行一个部署脚本,该脚本引用包含脚本的函数
  6. 它还运行命令行应用程序并将输出直接发送到屏幕
  7. 该脚本通常会在第一时间运行。但是,经过几次尝试后,命令行工具将停止工作并将输出完全发送到屏幕。如果我在运行脚本后尝试运行命令行工具(不是cmd-let),它就不再工作了:没有输出,什么都没做。它就像在空白提示符下输入一样。任何特定于PowerShell或运行的GUI应用程序都可以正常工作,但运行任何控制台应用程序都不会产生任何可见的结果。解决这个问题的唯一方法是关闭我的PowerShell并再次打开它。它通常会工作一次,我将不得不再次关闭它。我们的用户当然不会对此感到高兴..

    剧本中最“值得注意的”事情:

    • 广泛使用scriptblocks(用于日志记录),脚本块被发送到使用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,我只是直接使用该字符串。我仍然不明白这是如何工作的,但似乎我可以访问所有原始类型的变量,即使不将它们作为参数传递,但我必须传递更复杂的对象是params,否则它们没有任何价值。

    更新: 经过多次寻找和痛苦的日子。我发现其他人也有同样的痛苦。我的代码表现出与此处描述的完全相同的症状: http://connect.microsoft.com/PowerShell/feedback/details/496326/stability-problem-any-application-run-fails-with-lastexitcode-1073741502

    我想这个问题尚未解决。

1 个答案:

答案 0 :(得分:1)

过了一会儿,我注意到如果我运行了一些非常耗费内存的功能,我也会遇到这样的行为:你尝试执行的所有内容都会再次进入提示状态。我建议设置Set-PsDebug -Trace 2以查看这些功能实际上在做什么。我通过这样做解决了问题,并弄清楚如何提高我的功能效率。