3

我正在尝试在PowerShell中编写一个脚本,该脚本将在远程机器上使用带有凭据的调用命令来执行代码,该代码将返回包含该机器上 Java 版本的字符串。Java 没有安装,有时它只是作为JDK文件夹放在服务器中,并且应用程序指向该位置,所以很遗憾我无法使用注册表找到 Java 版本。我想出的唯一想法是从调用命令中调用类似以下内容的内容:

& "path_to_java.exe" "-version"

甚至更复杂的东西,然后使用正则表达式来查找版本:

start-process $java -ArgumentList "-version" -NoNewWindow -Wait -RedirectStandardError "$path\tempoutput.txt"
$javaversionoutput = gc "$path\tempoutput.txt"
del "$path\tempoutput.txt"

但是,在某些服务器上,我一直遇到一个问题,它抱怨没有足够的堆空间来运行该 Java 版本命令(通过该远程服务器上的调用命令)。

Error occurred during initialization of VM
Could not reserve enough space for object heap
D:\Java\jdk1.6.0_39\bin\java.exe
Could not create the Java virtual machine.
+ CategoryInfo          : NotSpecified: (Could not creat...irtual machine.:String) [],     RemoteException
+ FullyQualifiedErrorId : NativeCommandError
+ PSComputerName        : <server>

根据我的研究,它与为远程 PowerShell 会话设置的 MaxMemoryPerShellMB 有关。在某些服务器上,它设置为 150,在某些服务器上设置为 1024。所以有时我可以成功地java -version从 PowerShell 远程会话运行,有时我不能,因为内存太少。如果我通过登录并手动将其设置在远程计算机上:

winrm set winrm/config/winrs '@{MaxMemoryPerShellMB="1000"}

它开始工作。但是我不能每次都去每台服务器手动设置。如果我尝试通过调用命令设置 MaxMemoryPerShellMB,它会说我无权访问,即使我可以使用相同的帐户在服务器上更改 MaxMemoryPerShellMB,如果我登录并直接执行。

我觉得我已经用完了解决方案,并希望在这里找到一些帮助。抱歉,如果有这个话题,我只找到了三个,没有一个回答我的问题。有兴趣的朋友可以参考以下。我真的找不到任何东西:P

4

3 回答 3

2

老实说,我只是检查文件的版本java.exe,比如

$Machines = Get-Content C:\Lists\Servers.txt

$Machines | for-each{

$java = gci '\\$_\c$\Program Files (x86)\Java\jre7\bin\java.exe'

$java.VersionInfo

然后你得到一个VersionInfo 对象,比如

 ProductVersion   FileVersion      FileName
 --------------   -----------      --------
 7.0.510.13       7.0.510.13       \\$_\c$\Program Files (x86)\Java\jre7\bin\java.exe

或者$null如果找不到路径(当然你可以先用 test-path 进行检查,但无论如何)。好消息是,如果您愿意,您可以使用 VersionInfo 对象进行实际操作,这是 powershell 的一大好处。Java 很烂。

于 2014-02-19T03:38:05.823 回答
1

您可以使用这一行来安装最新的 java 版本。如果您也安装了旧版本,它只会返回最新版本:

[system.diagnostics.fileversioninfo]::GetVersionInfo(('C:\Program Files (x86)\Java\'+([regex]::matches((&"java.exe" -version 2>&1)[0].ToString(), '(?<=\").+?(?=\")').value.Insert(0,"jre")) + "\bin\java.exe"))
于 2017-11-24T09:01:01.913 回答
0

这应该没有问题

gc "D:\serverlists\serverlist.txt" | foreach {  
[system.diagnostics.fileversioninfo]::GetVersionInfo("\\$_\c$\Program Files\Java\jre6\bin\java.exe"); }
于 2015-09-03T06:46:45.810 回答