Powershell:モジュールからメソッドを呼び出した後にコマンドラインアプリケーションが動作しない

私はいくつかの他のpowershellスクリプトを含むpowershellモジュール(.psm1)ファイルを作成しました。私たちはそれをsharepointに使います。

基本的に、ここでは何が起こるのですか:

  1. レジストリからモジュールの場所を取得するデプロイスクリプトがあります。
  2. Import-Moduleコマンドレットを使用してモジュールをロードします(-forceスイッチを使用)
  3. このモジュールはSharepoint 2010のスナップインと作成した他のスクリプトをロードします。
  4. スクリプトを実行して、含まれているスクリプトの関数を参照する
  5. また、コマンドラインアプリケーションを実行し、出力を直接画面に送信します。

スクリプトは、通常、初めて動作します。しかし、数回試行した後、コマンドラインツールは動作を停止し、画面に出力を送信します。スクリプトを実行した後にコマンドラインツール(cmd-letではない)を実行しようとすると、もう動作しません。出力も何も行われません。それはちょうど空白のプロンプトに打つと同じです。 PowerShell特有のGUIアプリケーションや動作中のGUIアプリケーションはうまく動作しますが、コンソールアプリケーションを実行しても妥当な結果は得られません。これに対する唯一の解決策は、私のパワーシェルを閉じてもう一度開くことです。それは通常1回の作業で、もう一度閉じる必要があります。私たちのユーザーは確かにそれについて幸せになるだろう..

スクリプト上で最も顕著なもの:

  • スクリプトブロックは広範囲に(ロギングのために)使用され、スクリプトブロックは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を渡して、文字列を直接使用することにも注意してください。私はまだこれがどのように動作するのか理解できませんが、引数として渡さなくてもすべてのプリミティブ型の変数にアクセスできるようですが、より複雑なオブジェクトを渡す必要があります。

Update: after much searching and days of pain. I have found others with the same pain. My code exhibits the same exact symptoms as described here: http://connect.microsoft.com/PowerShell/feedback/details/496326/stability-problem-any-application-run-fails-with-lastexitcode-1073741502

私はこの問題にまだ解決策がないと思います。

2
特別な理由はありませんでした(私が触ったときにすでにそこにあった)。しかし、私はそれを削除しようとしましたが、何の違いもありませんでした。しかし、それは私がやった他の何かとの接合で問題を引き起こしている可能性を排除できないのですか?
追加された 著者 Mel,
実際、私は2つの異なる地理的な場所で5つの異なるマシンからこれを実行しました。パフォーマンスは問題ではなく、すべてのマシンは16/32GBマルチプロセッサー(忘れてしまったことが多い)構成とそのちょうど実行されている共有ポイントとスクリプト、それ以外は何もありません。
追加された 著者 Mel,
@ CosmosKeyこんにちはコスモス、私はスクリプトブロックの使用方法を反映するために私の質問を更新しました。それはそれに関連するかもしれない..しかし正直なところ、私は確信していません。
追加された 著者 Mel,
@ RomanKuzmin私の悪い。投稿したリンクが表示されませんでした。それはまったく同じようです。今...次は何をするか.....
追加された 著者 Mel,
@ KevinBuchanええ、それはちょうどタイプミスでした。何がgci varialeですか?あなたはgci == getchilditemsを意味しますか?
追加された 著者 Mel,
@Mel、InvokeCommand関数のコードを投稿できますか? (あるいはInvoke-Commandからダッシュを外したのですか?)また、実行後に "gci variable:"を実行して、クリーンアップが必要なものがあるかどうかを確認してください。あなたは、何かばかげているかもしれないあなたのトランザクションやコマンド履歴を記録する何かをあなたのプロフィールに持っていますか?
追加された 著者 Kevin Buchan,
ええ、GCIはGet-ChildItemsのエイリアスです。 "variable:"を呼び出すと、どの変数が定義されているかがわかります。そこに何か有益なことがあるかもしれませんし、Remove-Variableを使ってそれらをきれいにすることができます。それは単なる考えです。
追加された 著者 Kevin Buchan,
なぜ -Force Import-Module を使うのですか?
追加された 著者 Roman Kuzmin,
私は大部分が好奇心から尋ねました。私はシナリオでこのスイッチを使用せず、必要なシナリオに興味があります。あなたの問題に関しては、私はこのようなものを見たことがありません。しかし、スクリプトモジュールには予期しない動作や問題があります。試してもそれほど難しくない場合は、スクリプトモジュールではなくスクリプトライブラリをお勧めします(モジュールをスクリプトに変換していくつかの問題を解決しました)。これはおそらくばかげたアドバイスですが、私が見ているように他には何もありません。
追加された 著者 Roman Kuzmin,
ところで、「パワーシェルで希望を失ってはいけない」。通常、PowerShellでタスクを解決するには、複数の方法があります。最初に実装されたものはしばしば最高のものではありません。
追加された 著者 Roman Kuzmin,
追加された 著者 Roman Kuzmin,
外部のコマンドに問題があるかどうか確かめてください。私はこの文書をオンラインで見つけ出すのに苦労していますが、PS v1/2でかなりよく知られているバグ/デザイン問題があります。 「あまりにも多く」はシステムに関連しています。私はこれがV3で修正されていると信じています。
追加された 著者 Daniel Richnak,
それはマシン固有のもののように聞こえる。複数のシステムで試しましたか?タスクマネージャを使用して、妥当な量のメモリ、スレッド、最も重要なハンドルを使用していることを確認することもできます。
追加された 著者 Eric Nicholson,
Mel、あなたは大まかにスクリプトブロックを使用します。モジュールには独自の可変スコープツリーがあることに注意してください。どのようにコードを使用するのかわかりませんが、ScriptBlockを適切に処理するにはGetNewClosure()を使用する必要があります。閉鎖関連であるこの他の質問に対する私の答えを見てください。 stackoverflow.com/questions/6264374/…
追加された 著者 CosmosKey,

1 答え

しばらくすると、私は非常にメモリ集中的な機能を実行した場合、実行しようとするすべてがただちにプロンプ​​トに戻るような動作を得ていることに気付きました。これらの機能が実際に何をしているのかを知るには、Set-PsDebug -Trace 2を設定することをお勧めします。私はこれを行い、私の機能をより効率的にする方法を考え出すことで、私の問題を解決しました。

1
追加された