我正在尝试在PowerShell中编写一个脚本,该脚本将使用带有远程计算机上的凭据的invoke命令来执行将在该计算机上返回包含Java版本的字符串的代码。 Java没有安装,有时它只是作为JDK文件夹放在服务器中,应用程序指向该位置,所以不幸的是我无法使用注册表来查找Java版本。我想出的唯一想法是在invoke命令中调用以下内容:
& "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
答案 0 :(得分: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
如果找不到路径(当然你可以先用test-path检查,但不管怎样)。好的一点是,如果您这样选择,可以使用VersionInfo对象执行实际操作,这是PowerShell的一个非常好的好处。而Java很糟糕。
答案 1 :(得分:0)
这应该没有问题
gc "D:\serverlists\serverlist.txt" | foreach {
[system.diagnostics.fileversioninfo]::GetVersionInfo("\\$_\c$\Program Files\Java\jre6\bin\java.exe"); }
答案 2 :(得分: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"))