2014-02-18 83 views
3

我试图编写一个脚本PowerShell,它将使用invoke命令和远程机器上的凭据执行代码,该代码将返回包含该机器上Java版本的字符串。 Java未安装,有时它只是作为JDK文件夹放在服务器中,并且应用程序指向该位置,因此不幸的是我无法使用注册表来查找Java版本。我想出的唯一的想法是从线沿线的invoke命令的东西中调用:从远程服务器的PowerShell获取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版本命令(通过该远程服务器上的invoke命令)。

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.因此,有时我可以成功地从PowerShell远程会话中运行java -version,有时我无法执行操作,因为内存太少。如果我通过登录并手动进行远程机器设置:

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

它开始工作。但我无法每次都去每台服务器并手动设置。如果我尝试通过invoke命令设置MaxMemoryPerShellMB,它表示我没有访问权限,即使我可以使用相同的帐户来更改服务器上的MaxMemoryPerShellMB,如果我直接登录并执行此操作。

我觉得我已经用完了解决方案,希望能在这里找到一些帮助。对不起,如果有这个话题,我只找到三个,没有一个回答我的问题。以下是参考,如果你们有兴趣。真的有什么我能找到的:P

+1

你可以尝试添加这个参数到jvm:'-Xms 10m'。希望能达到10米。我不知道这是否可行,因为jvm实际上可能会尝试为东西分配空间,但值得一试。 – CodeChimp

+0

当您运行invoke-command时,您是否处于提升的PowerShell提示符下? –

+1

您有没有使用WMI的理由? 'Get-WmiObject -Class Win32_Product -Filter“名称如'Java%'”| Select -Expand Version' –

回答

3

老实说,我只想检查文件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如果没有找到路径(当然你也可以检查该先用测试路径,但无论)。好的是你可以用VersionInfo对象做实际操作,如果你愿意的话,这是PowerShell的一个很棒的好处。而Java很糟糕。

+0

非常不错的可靠解决方案。这很好:)谢谢! – alexfvolk

0

这应该没有问题

gc "D:\serverlists\serverlist.txt" | foreach { 
[system.diagnostics.fileversioninfo]::GetVersionInfo("\\$_\c$\Program Files\Java\jre6\bin\java.exe"); } 
0

工作,你可以使用这一个衬垫用于获取安装最新的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")) 
相关问题