我試圖編寫一個腳本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
- Running Java remotely using PowerShell
- How to get the Java version in PowerShell
- Cannot run Java from the Windows PowerShell command prompt
你可以嘗試添加這個參數到jvm:'-Xms 10m'。希望能達到10米。我不知道這是否可行,因爲jvm實際上可能會嘗試爲東西分配空間,但值得一試。 – CodeChimp
當您運行invoke-command時,您是否處於提升的PowerShell提示符下? –
您有沒有使用WMI的理由? 'Get-WmiObject -Class Win32_Product -Filter「名稱如'Java%'」| Select -Expand Version' –