【问题标题】:Powershell: commandline applications not working after calling method from modulePowershell:从模块调用方法后命令行应用程序不起作用
【发布时间】:2011-11-25 10:11:46
【问题描述】:

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

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

  1. 我有一个从注册表中检索模块位置的部署脚本
  2. 它使用 Import-Module cmdlet 加载模块(使用 -force 开关)
  3. 此模块依次加载 Sharepoint 2010 管理单元和我创建的一些其他脚本
  4. 它运行一个部署脚本,该脚本引用包含的脚本中的函数
  5. 它还运行命令行应用程序并将输出直接发送到屏幕

脚本通常会在第一次运行。但是,经过几次尝试后,命令行工具将停止工作并将输出完全发送到屏幕。如果我在运行我的脚本后尝试运行命令行工具(不是 cmd-let),它就不再工作了:没有输出,什么也没做。它与在空白提示符上按回车键相同。任何特定于 powershell 或正在运行的 GUI 应用程序都可以正常工作,但运行任何控制台应用程序都不会产生任何可以想象的结果。唯一的解决方案是关闭我的powershell并再次打开它。它通常会工作一次,我将不得不再次关闭它。我们的用户肯定不会对此感到高兴..

剧本中最“值得注意”的地方:

  • 脚本块被广泛使用(用于记录),脚本块被发送到处理程序,该处理程序使用invokecommand 执行它并记录步骤
  • 它操纵共享点对象
  • 所有物品都妥善处理
  • 没有创建或更改静态变量
  • 所有脚本共享一些全局变量

我尝试过的: 我将我的代码条带化到最低限度:加载一个 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

我想这个问题还没有解决方案。

【问题讨论】:

  • 为什么将Import-Module-Force 一起使用?
  • 没有特别的原因,(当我触摸它时它已经在那里)。但是,我尝试将其删除,但没有任何区别。但我不能排除它可能与我做过的其他事情一起导致问题的可能性?
  • 我问主要是出于好奇。我不在我的场景中使用此开关,我对需要它的场景感兴趣。至于你的问题,我从来没有见过这样的事情。但是脚本模块确实有意想不到的行为和问题。如果不是太难尝试,我会推荐一个脚本库而不是脚本模块(我通过将模块转换为脚本解决了一些问题)。这也许是一个愚蠢的建议,但我认为没有别的了。
  • 顺便说一句,不要“对 powershell 失去希望”。在 PowerShell 中解决任务的方法通常不止一种。第一个实施通常不是最好的(我自己说:))。

标签: sharepoint powershell


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2022-08-20
    • 2018-08-25
    • 2011-01-11
    • 2022-12-21
    相关资源
    最近更新 更多