0

C#コードから、powershellからすべての名前空間を取得しようとしています... (名前空間の作成など、後でより複雑なこと)

PowerShell ps = PowerShell.Create();
ps.AddCommand("Import-Module").AddArgument("ServiceBus").Invoke();
var result = ps.AddCommand("Get-SBNamespace").Invoke();

上記のコードでは、次の例外が発生します。

モジュール 'ServiceBus' で 'Get-SBNamespace' コマンドが見つかりましたが、モジュールを読み込めませんでした。詳細については、「Import-Module ServiceBus」を実行してください。

このエラーを解決する方法を知っている人はいますか?

現在の状況:いくつかのデバッグの後、PowerShell オブジェクトに既定でモジュールが読み込まれていないことがわかりました。コードの使用:

InitialSessionState iss = InitialSessionState.CreateDefault();
iss.ImportPSModule(new string[]{@"serviceBus"});
PowerShell ps = PowerShell.Create(iss);

サービス バス モジュールの読み込みが機能しません。また、コード:

ps.AddCommand("Import-Module").AddParameter("-Name", "serviceBus").Invoke();

サービス バス モジュールのインポートが機能しません。Visual Studio を管理者モードで実行しても違いはありません

前もって感謝します

4

4 に答える 4

2

使用している Visual Studio のバージョンについては言及していません。VS 2012 の場合、x64 プラットフォーム ターゲットを試したときに、[32 ビットを優先] がチェックされていないことを確認しましたか? チェックされていない場合でも、チェックして、プロジェクト構成を保存し、クリアしてから再度保存してみてください。これは、別のプロジェクトでうまくいきました。

アップデート

VS2012 には、実際にアクティブなときに「32 ビットを優先」がグレー表示され、チェックされていないというバグがあることが他の場所で示唆されています。Update 2 を実行していますが、それが表示されません。しかし、あなたはそうかもしれません。.csproj ファイルを直接編集することをお勧めします。

[プラットフォーム ターゲット] が [任意の CPU] に設定されている状態で、ソリューション エクスプローラーでプロジェクト名を右クリック (または、[プロジェクト] メニューに移動) し、[プロジェクトのアンロード] を選択します。プロジェクト ファイルが閉じられ、ソリューション エクスプローラーにプロジェクト名が表示されます(使用不可) > プロジェクト ファイルがアンロードされました:

アンロードされたプロジェクト

プロジェクト名をもう一度右クリックし、[プロジェクト名の編集.csproj] を選択します。ファイルは XML で、ほとんどがPropertyGroup要素とItemGroup要素で構成されています。コンソール プロジェクトでは、通常、最初の PropertyGroup に Platform 要素が含まれており、上記の手順に従った場合、AnyCPU を読み取る必要があります。次の 2 つの PropertyGroups は通常、デバッグおよびリリース構成用です。別の構成を追加した場合は、独自の PropertyGroup があります。これらのそれぞれで、次の要素を探します。

<Prefer32Bit>true</Prefer32Bit>

必要なのは、次の要素です。

<Prefer32Bit>false</Prefer32Bit>

ファイルを変更するか、(各構成の ProjectGroup に) 挿入し、ファイルを保存して閉じます。ソリューション エクスプローラーに戻り、プロジェクトを右クリックして [プロジェクトの再読み込み] を選択します。それで解決するかどうか教えてください。次の結果を取得することで、PowerShell が現在 64 ビットで実行されていることを確認できます。

[System.IntPtr]::Size

例えば

ps.AddScript("[System.IntPtr]::Size");

これは、x86プロセスでは4x64プロセスでは8になります。

私のプロジェクトはこのように設定されていましたが、次を使用して ServiceBus をロードできました。

ps.AddCommand("Import-Module").AddArgument("ServiceBus");

うまくいけば、あなたもそうするでしょう。

于 2013-05-05T08:27:58.873 に答える
1

私はServiceBusをインストールしていないので、あなたが試したことを正確に確認することはできませんが、

ps.AddCommand("Import-Module").AddArgument("ActiveDirectory").Invoke();

私のために働いたので、元の構文はよさそうです。

失敗をテストするために、私は試しました:

ps.AddCommand("Import-Module").AddArgument("CheeseDirectory");
ps.Commands.Commands[0].MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output);
var importResult = ps.Invoke();
foreach (PSObject result in importResult)
{
    Console.WriteLine(result);
}

そして得た

どのモジュール ディレクトリにも有効なモジュール ファイルが見つからなかったため、指定されたモジュール 'CheeseDirectory' は読み込まれませんでした。

同様に試しましたか?

于 2013-05-05T08:29:15.240 に答える
0

いくつかのモジュールをインポートして、モジュール内でコマンドレットまたは関数を実行しようとしているようですね。

したがって、次のコードを試すことができると思います。

PowerShell ps = PowerShell.Create();
Assembly ass = Assembly.LoadFile(@"yourServiceBus.dll");
ps.AddCommand("Import-Module").AddParameter("Assembly", ass).Invoke();
var result = ps.AddCommand("Get-SBNamespace").Invoke();

これが役立つことを願っています。

于 2013-05-06T02:00:21.170 に答える