2014-02-18 87 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")) 
相關問題