1

サード パーティのモジュール (NetCmdlets) を利用し、Powershell ウィンドウから完全に正常に動作する PS4 スクリプトを移植していますが、Java プログラムから実行したときにサード パーティのモジュールをロードする方法を見失ったようです。

これの潜在的な原因と解決策について、誰かの考えに興味があります...

Calling Java PGM は次のとおりです。

package ImagineOne.PSJava2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ExecuteCommand {

 /**
  * @param args
  * @throws IOException 
  */
 public static void main(String[] args) throws IOException {

  // This is the command
 //  String command = "powershell.exe  $PSVersionTable.PSVersion | Get-Member";
 // String command = "powershell.exe  C:\\Users\\versaggi\\Desktop\\PowerCLI\\DevScripts\\CANES_VMWare_Extraction_Functions.ps1";
 String command = "powershell.exe  C:\\Users\\versaggi\\Desktop\\PowerCLI\\DevScripts\\CANES_IBM_RackSwitch_Extraction_Functions.ps1";

  Process powerShellProcess = Runtime.getRuntime().exec(command);
  powerShellProcess.getOutputStream().close();
  String line;

  System.out.println("Output:");
  BufferedReader stdout = new BufferedReader(new InputStreamReader(powerShellProcess.getInputStream()));

  while ((line = stdout.readLine()) != null) {
   System.out.println(line);
  }

  stdout.close();
  System.out.println("Error:");
  BufferedReader stderr = new BufferedReader(new InputStreamReader(powerShellProcess.getErrorStream()));

  while ((line = stderr.readLine()) != null) {
   System.out.println(line);
  }

  stderr.close();
  System.out.println("Done");

 }

} //End Class

これは出力です:

Output:
** NetCmdlets Modules Loaded ** 
** Disconnected from RackSwitch ** 
Error:
Import-Module : **The specified module 'C:\Windows\System32\WindowsPowerShell\v1.
0\Modules\NetCmdlets\NetCmdlets.psd1' was not loaded because no valid module 
file was found in any module directory**.At C:\Users\versaggi\Desktop\PowerCLI\De
vScripts\CANES_IBM_RackSwitch_Extraction_Functions.ps1:732 char:1
+ Import-Module 
C:\Windows\System32\WindowsPowerShell\v1.0\Modules\NetCmdlets\NetC ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~
    + CategoryInfo          : ResourceUnavailable: (C:\Windows\Syst...NetCmdle 
   ts.psd1:String) [Import-Module], FileNotFoundException
    + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Comm 
   ands.ImportModuleCommand

Done

これは PowerShell スクリプトです: (これはモジュールをテストとしてロードすることのみを想定しています [概念実証])

Import-Module C:\Windows\System32\WindowsPowerShell\v1.0\Modules\NetCmdlets\NetCmdlets.psd1

write-host "** NetCmdlets Modules Loaded ** "

私が熟読して検討したいくつかの研究開発:

http://technirman.blogspot.com/2014/06/invoke-powershell-commands-through-java.html

https://blogs.oracle.com/vaibhav/entry/not_as_easy_as_we

https://social.technet.microsoft.com/Forums/windowsserver/en-US/d32537bd-0aef-440e-8760-6b3085390c37/executing-powershell-script-via-java?forum=winserverpowershell

4

1 に答える 1

0

Java/Powershell の相互運用性の問題を今修正しました。直感で ( VMwareが問題のないモジュールで行ったことを掘り下げた後)、 NetCmdletsはデフォルトで Windows OS の保護されたスペース(以下のディレクトリを参照) にモジュールをインストールしたと推測しました。保護されていないユーザー スペース(以下のディレクトリを参照) に移動した後、問題なく動作しました。私もいくつかのストレステストを行いましたが、それはうまくいきました。

保護された Win OS スペース:

$PSHome\Modules (%Windir%\System32\WindowsPowerShell\v1.0\Modules) 

保護されていないスペース:

C:\Users\versaggi\Desktop\PowerCLI\windowspowershell\modules

件名のWindowsドキュメントによると:

モジュールを PSModulePath にインストールする

可能な限り、すべてのモジュールを PSModulePath 環境変数にリストされているパスにインストールするか、モジュール パスを PSModulePath 環境変数値に追加します。PSModulePath 環境変数 ($env:PSModulePath) には、Windows PowerShell モジュールの場所が含まれています。コマンドレットは、この環境変数の値に依存してモジュールを検索します。

デフォルトでは、PSModulePath 環境変数値には次のシステムおよびユーザー モジュール ディレクトリが含まれますが、値を追加および編集できます。

$PSHome\Modules (%Windir%\System32\WindowsPowerShell\v1.0\Modules)

警告 注意:

この場所は、Windows に付属するモジュール用に予約されています。モジュールをこの場所にインストールしないでください。

于 2015-06-12T03:04:34.150 に答える