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:
{
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,
}
- 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)
1
2
3
4
5 | Pattern pattern = Pattern.compile("%(.*?)%");
Matcher matcher = pattern.matcher(valorInicial);
String grupoCeroPatronEntrePorcentajes = matcher.group(0);
String grupoUnoPatronSinPorcentaje = matcher.group(1);
|
- 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
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
No hay comentarios:
Publicar un comentario