Me encontrando en C# la necesidad de expandir una variable de entorno (%PUBLIC%) y ha sido recontra facil:
1 2 3 4 | public static string ExpandEnviromentVariable(string source) { return Environment.ExpandEnvironmentVariables(source); } |
Tratando de realizar la misma operacion en java no ha resultado tan facil, pero es posible. La estratégia resulta ser la siguiente:
- Obtener un mapa del sistema con todas las variables de entorno System.getenv(), mi mapa resulto ser asi:
- Crear un Patter para divir la variable en 2 grupos: uno con la expresion completa y el otro sin los porcentajes (Este seria la key del mapa de variabless)
- Luego con la key en la mano, se obtiene el valor del mapa
- Por ultimo se hace un replace del grupo uno(entre porcentaje) con el value del mapa obtenido con el grupo dos
{ LOCALAPPDATA=C:\Users\Desarollo-VII\AppData\Local, ChocolateyLastPathUpdate=marjun1911:39:562018, PROCESSOR_LEVEL=16, FP_NO_HOST_CHECK=NO, M2=C:\dev\apache-maven-3.2.1/bin, VS140COMNTOOLS=C:\ProgramFiles(x86)\MicrosoftVisualStudio14.0\Common7\Tools\, USERDOMAIN=DESARROLLOVI, LOGONSERVER=\\DESARROLLOVI, JAVA_HOME=C:\ProgramFiles\Java\jdk1.8.0_91, SESSIONNAME=Console, ALLUSERSPROFILE=C:\ProgramData, PROCESSOR_ARCHITECTURE=AMD64, PSModulePath=..., SystemDrive=C:, ANT_HOME=C:\dev\apache-ant-1.9.7, DEV_HOME=C:\dev, APPDATA=C:\Users\Desarollo-VII\AppData\Roaming,=A:=A:\, USERNAME=Desarollo-VII, ChocolateyInstall=C:\ProgramData\chocolatey, ProgramFiles(x86)=C:\ProgramFiles(x86), JBOSS_HOME_=C:\dev\APPsERVER\jboss-4.2.3.GA, CommonProgramFiles=C:\ProgramFiles\CommonFiles, Path=..., PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC, OS=Windows_NT, COMPUTERNAME=DESARROLLOVI, JBOSS_HOME=C:\dev\APPsERVER\wildfly-10.1.0.Final, PROCESSOR_REVISION=0402, CommonProgramW6432=C:\ProgramFiles\CommonFiles, ComSpec=C:\Windows\system32\cmd.exe, ProgramData=C:\ProgramData, ProgramW6432=C:\ProgramFiles, HOMEPATH=\Users\Desarollo-VII, SystemRoot=C:\Windows, TEMP=C:\Users\DESARO~1\AppData\Local\Temp, HOMEDRIVE=C:, PROCESSOR_IDENTIFIER=AMD64Family16Model4Stepping2, USERPROFILE=C:\Users\Desarollo-VII, TMP=C:\Users\DESARO~1\AppData\Local\Temp, M2_HOME=C:\dev\apache-maven-3.2.1, CommonProgramFiles(x86)=C:\ProgramFiles(x86)\CommonFiles, ProgramFiles=C:\ProgramFiles, PUBLIC=C:\Users\Public, NUMBER_OF_PROCESSORS=3, windir=C:\Windows, }
1 2 3 4 5 | Pattern pattern = Pattern.compile("%(.*?)%"); Matcher matcher = pattern.matcher(valorInicial); String grupoCeroPatronEntrePorcentajes = matcher.group(0); String grupoUnoPatronSinPorcentaje = matcher.group(1); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public static String expandEnvironmentVariables(String valorInicial) { String valorRetorno = null; Map<String, String> variablesEntorno = System.getenv(); Pattern pattern = Pattern.compile("%(.*?)%"); Matcher matcher = pattern.matcher(valorInicial); while (matcher.find()) { String grupoCeroPatronEntrePorcentajes = matcher.group(0); String grupoUnoPatronSinPorcentaje = matcher.group(1); String valorVariableEntorno = variablesEntorno.get(grupoUnoPatronSinPorcentaje); valorRetorno = valorInicial.replace(grupoCeroPatronEntrePorcentajes, valorVariableEntorno); } return valorRetorno; } |
Ejemplo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | System.out.println(expandEnvironmentVariables("%USERPROFILE%\\archivo.txt")); System.out.println(expandEnvironmentVariables("%APPDATA%\\.minecraft")); System.out.println(expandEnvironmentVariables("%PUBLIC%\\PepeFolder")); System.out.println(expandEnvironmentVariables("%WINDIR%\\fonts")); System.out.println(expandEnvironmentVariables("%JAVA_HOME%\\jre\\bin\\java.exe")); System.out.println(expandEnvironmentVariables("%JBOSS_HOME%\\bin\\run.bat")); System.out.println(expandEnvironmentVariables("%M2%")); System.out.println(expandEnvironmentVariables("%ANT_HOME%")); /* Outputs: C:\Users\Desarollo-VII\archivo.txt C:\Users\Desarollo-VII\AppData\Roaming\.minecraft C:\Users\Public\PepeFolder No se encontro la variable : %WINDIR%\fonts C:\Program Files\Java\jdk1.8.0_91\jre\bin\java.exe C:\dev\APPsERVER\wildfly-10.1.0.Final\bin\run.bat C:\dev\apache-maven-3.2.1/bin C:\dev\apache-ant-1.9.7 */ |
Lo unico que habria que validar, es que el mapa no es lo mismo la key PUBLIC o public